W3docs

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 false en caso de fallo. El valor no se modifica.
  • Saneartransformar 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:

FiltroTareaEjemplo de uso
FILTER_VALIDATE_EMAILValidarComprobar una dirección de email
FILTER_VALIDATE_INTValidarComprobar un entero, opcionalmente dentro de un rango
FILTER_VALIDATE_FLOATValidarComprobar un número de punto flotante
FILTER_VALIDATE_URLValidarComprobar una URL
FILTER_VALIDATE_IPValidarComprobar una dirección IPv4/IPv6
FILTER_SANITIZE_FULL_SPECIAL_CHARSSanearCodificar caracteres especiales HTML
FILTER_SANITIZE_NUMBER_INTSanearEliminar todo excepto dígitos y +/-
FILTER_SANITIZE_EMAILSanearEliminar 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_UNICODE permite caracteres internacionales en la validación de email.
  • Funciones de callback: permiten pasar una función personalizada a FILTER_CALLBACK para lógica de validación o saneación específica.
  • Filtrado de arrays: usa filter_var_array() o filter_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

php— editable, runs on the server

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

php— editable, runs on the server

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:

  • false es un valor válido. Cuando un valor es legítimamente 0 o "0", una comprobación ingenua con if (filter_var(...)) lo trata como fallo. Compara contra false explí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) o false; nunca sanea. Si necesitas una cadena limpia, usa un filtro FILTER_SANITIZE_*.
  • La validación de email no verifica la entrega. FILTER_VALIDATE_EMAIL solo comprueba la sintaxis — no puede confirmar si el buzón existe. Añade FILTER_FLAG_EMAIL_UNICODE si 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.

Práctica

Práctica
¿Cuáles de los siguientes filtros se usan en PHP?
¿Cuáles de los siguientes filtros se usan en PHP?
Was this page helpful?