Filtros Avanzados de PHP: Guía Completa
Aprende a usar filtros avanzados de PHP para validar y sanear datos de entrada con flags, callbacks y filtrado por lotes.
Filtrar la entrada es uno de los hábitos de seguridad más importantes en PHP: todo valor que llegue desde fuera de tu código — campos de formulario, cadenas de consulta, cookies, payloads de API — debe tratarse como no confiable hasta que haya sido validado o limpiado. PHP incluye una extensión de filtros integrada que hace exactamente esto, por lo que raramente necesitas escribir expresiones regulares a mano para las comprobaciones más comunes. Este capítulo va más allá de los conceptos básicos y cubre flags de filtros, callbacks, filtrado por lotes, valores predeterminados y los errores comunes que sorprenden a la gente en producción.
Si eres nuevo en la extensión de filtros, comienza con el capítulo introductorio Filtros de PHP, y luego regresa aquí.
Comprender los filtros de PHP
Un filtro es una regla con nombre que PHP aplica a un valor mediante la función filter_var() (y sus variantes). Hay dos tareas que un filtro puede realizar:
- Validar — comprobar si un valor ya coincide con un formato y devolver el valor en caso de éxito o
falseen caso de fallo. El valor no se modifica. - Sanear — transformar un valor eliminando o codificando los caracteres no deseados, y devolver la cadena limpia.
Saber qué tarea necesitas importa: la validación rechaza datos incorrectos, la saneación los reescribe. Para formularios de usuario normalmente validas primero (rechazas) y saneas solo cuando debes aceptar y limpiar un valor (por ejemplo, escapar HTML antes de mostrarlo).
Tipos de filtros
PHP proporciona varios tipos de filtros que se pueden usar para distintos propósitos. Algunos de los más utilizados son:
- Filtros de validación: se usan para validar datos, como comprobar si una cadena es una dirección de email válida o si un número está dentro de un rango determinado.
- Filtros de saneación: se usan para sanear datos, como eliminar caracteres dañinos de una cadena o convertir caracteres especiales en entidades HTML.
- Filtros personalizados: permiten definir tus propias funciones de filtro personalizadas para necesidades específicas.
Un conjunto reducido de filtros cubre la gran mayoría de los casos del mundo real:
| Filtro | Tarea | Ejemplo de uso |
|---|---|---|
FILTER_VALIDATE_EMAIL | Validar | Comprobar una dirección de email |
FILTER_VALIDATE_INT | Validar | Comprobar un entero, opcionalmente dentro de un rango |
FILTER_VALIDATE_FLOAT | Validar | Comprobar un número de punto flotante |
FILTER_VALIDATE_URL | Validar | Comprobar una URL |
FILTER_VALIDATE_IP | Validar | Comprobar una dirección IPv4/IPv6 |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Sanear | Codificar caracteres especiales HTML |
FILTER_SANITIZE_NUMBER_INT | Sanear | Eliminar todo excepto dígitos y +/- |
FILTER_SANITIZE_EMAIL | Sanear | Eliminar caracteres no permitidos en un email |
Puedes listar todos los filtros que admite tu build con filter_list().
Usar filtros de PHP
La sintaxis básica para aplicar un filtro es:
Sintaxis de la función filter_var de PHP
filter_var($variable, $filter, $options);Donde $variable es el valor que deseas filtrar, $filter es una constante de filtro como FILTER_VALIDATE_EMAIL, y el argumento opcional $options contiene flags u opciones específicas del filtro.
filter_var($variable, FILTER_VALIDATE_EMAIL);Aquí filter_var() comprueba si el valor almacenado en $variable es una dirección de email válida, devolviendo el email en caso de éxito o false en caso de fallo.
También existen funciones dedicadas para leer la entrada externa directamente — filter_input() para un único valor y filter_input_array() para muchos — que leen de INPUT_GET, INPUT_POST, INPUT_COOKIE, etc. Úsalas en lugar de acceder directamente a $_GET/$_POST, ya que leen los datos de la solicitud original aunque se haya modificado una superglobal.
Opciones avanzadas de filtros de PHP
Los filtros de PHP también incluyen varias opciones avanzadas para personalizar su comportamiento. Algunas de las más utilizadas son:
- Opciones de flag: modifican el comportamiento del filtro, como requerir un tipo de dato específico o permitir múltiples valores. Por ejemplo,
FILTER_FLAG_EMAIL_UNICODEpermite caracteres internacionales en la validación de email. - Funciones de callback: permiten pasar una función personalizada a
FILTER_CALLBACKpara lógica de validación o saneación específica. - Filtrado de arrays: usa
filter_var_array()ofilter_input_array()para aplicar filtros a múltiples variables a la vez, lo cual es especialmente útil para procesar datos de formularios o cadenas de consulta.
Ejemplos de filtros de PHP
Aquí hay algunos ejemplos de cómo los filtros de PHP se pueden usar en situaciones del mundo real:
PHP: validar un email con filter_var
En este ejemplo, la función filter_var se usa para validar una dirección de email. Si la dirección de email es válida, el script mostrará "Email is valid"; de lo contrario, mostrará "Email is not valid".
PHP: sanear una cadena con filter_var
En este ejemplo, la función filter_var se usa para sanear una cadena. El filtro FILTER_SANITIZE_FULL_SPECIAL_CHARS se utiliza para eliminar o codificar etiquetas HTML y caracteres especiales de la cadena, lo que da como resultado una cadena segura y limpia que puede usarse en tu aplicación.
Ejemplos avanzados de filtros de PHP
Para aprovechar al máximo el poder de los filtros de PHP, puedes usar callbacks y filtrado de arrays:
PHP: filtro con callback
<?php
function custom_sanitize($str) {
return strtoupper(trim($str));
}
$input = " hello world ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);
echo $result; // Outputs: HELLO WORLD
?>PHP: filtrar un array de variables
<?php
$data = [
"email" => "[email protected]",
"age" => "25",
"url" => "https://example.com"
];
$filters = [
"email" => FILTER_VALIDATE_EMAIL,
"age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
"url" => FILTER_VALIDATE_URL
];
$result = filter_var_array($data, $filters);
print_r($result);
?>Esto produce:
Array
(
[email] => [email protected]
[age] => 25
[url] => https://example.com
)Si algún valor no supera su filtro, esa clave contiene false en lugar del valor, lo que te permite identificar exactamente qué campo era inválido.
Validar un entero dentro de un rango
Las opciones min_range y max_range hacen que FILTER_VALIDATE_INT rechace números fuera de los límites — útil para cosas como una cantidad o una edad:
<?php
$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>Como 150 supera max_range, el filtro devuelve false aunque "150" sea una cadena entera perfectamente válida.
Proporcionar un valor predeterminado cuando la validación falla
La mayoría de los filtros de validación aceptan una opción default, para que puedas recurrir a un valor seguro en lugar de false:
<?php
$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
"options" => ["default" => 0.0]
]);
var_dump($price); // float(0)
?>Errores comunes
Algunos comportamientos sorprenden a los recién llegados:
falsees un valor válido. Cuando un valor es legítimamente0o"0", una comprobación ingenua conif (filter_var(...))lo trata como fallo. Compara contrafalseexplícitamente con el operador estricto:if (filter_var($n, FILTER_VALIDATE_INT) === false).- La validación no cambia el valor.
FILTER_VALIDATE_*devuelve tu valor original (con conversión de tipo donde corresponda) ofalse; nunca sanea. Si necesitas una cadena limpia, usa un filtroFILTER_SANITIZE_*. - La validación de email no verifica la entrega.
FILTER_VALIDATE_EMAILsolo comprueba la sintaxis — no puede confirmar si el buzón existe. AñadeFILTER_FLAG_EMAIL_UNICODEsi aceptas direcciones internacionalizadas. - Sanear no es lo mismo que escapar para SQL. Usa sentencias preparadas (o
mysqli_real_escape_string()) para consultas de bases de datos; los filtros son para limpiar formatos, no para la seguridad de las consultas.
Conclusión
En conclusión, los filtros de PHP son una herramienta esencial para los desarrolladores web que quieren validar y sanear datos de entrada. Con los distintos tipos y opciones disponibles, puedes adaptar fácilmente tus filtros a las necesidades específicas de tu aplicación. Ya sea que quieras validar emails, eliminar caracteres dañinos o realizar validaciones personalizadas, los filtros de PHP te tienen cubierto.
No olvides combinar los filtros con otras medidas de seguridad — sentencias preparadas, escapado de salida y protección CSRF — para mantener tu aplicación web lo más segura posible. Para un recorrido completo, consulta Validación de Formularios PHP.