filter_input()
Aprende cómo filter_input() de PHP sanitiza y valida entradas GET, POST y cookies, con FILTER_SANITIZE_* y FILTER_VALIDATE_*.
Introducción
filter_input() es una función integrada de PHP que lee una sola variable externa — de $_GET, $_POST, cookies, el entorno del servidor o getenv() — y la pasa por un filtro en un solo paso. Un filtro puede sanitizar el valor (eliminar o escapar caracteres no deseados) o validarlo (comprobar que coincide con un formato esperado y rechazarlo en caso contrario).
La razón principal para usar filter_input() en lugar de acceder directamente a $_GET['x'] es la seguridad por diseño: nunca se obtiene una superglobal en bruto, la función informa claramente cuando una variable no existe, y el filtro se aplica en el momento exacto en que se lee el valor. Esta página cubre la sintaxis, la diferencia entre sanitizar y validar, cómo interpretar sus tres posibles valores de retorno y un ejemplo completo de manejo de formularios.
¿Necesitas filtrar un valor que ya tienes en una variable (no de una superglobal)? Usa
filter_var(). Para filtrar varios campos a la vez, consultafilter_input_array().
Sintaxis
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Parámetro | Requerido | Descripción |
|---|---|---|
$type | Sí | La fuente de entrada: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV. |
$var_name | Sí | El nombre de la variable a leer, p. ej. 'email'. |
$filter | No | Un ID de filtro como FILTER_VALIDATE_EMAIL. Por defecto es FILTER_DEFAULT (sin filtrado). |
$options | No | Un array asociativo de opciones/flags, o una máscara de bits. Se usa para rangos, valores predeterminados, expresiones regulares, etc. |
Qué devuelve
filter_input() tiene tres posibles valores de retorno, y distinguirlos es el propósito central de usarla:
- el valor filtrado en caso de éxito;
falsesi el filtrado (validación) falla;nullsi la variable no está definida en la fuente de entrada solicitada.
Dado que false y null significan cosas distintas, compara con === en lugar de una comprobación de veracidad flexible.
Sanitizar vs. validar
Este es el punto de confusión más común, así que elige deliberadamente:
- Sanitizar (
FILTER_SANITIZE_*) — limpiar el valor y devolver la cadena limpia. Casi nunca "falla"; simplemente elimina o escapa caracteres. - Validar (
FILTER_VALIDATE_*) — comprobar el valor y devolverlo sin cambios en caso de éxito ofalseen caso de fallo. Úsalo cuando el campo tiene una forma estricta (email, entero, URL, booleano).
FILTER_SANITIZE_STRINGfue eliminado en PHP 8.0. UsaFILTER_SANITIZE_FULL_SPECIAL_CHARS(ohtmlspecialchars()al mostrar la salida) en su lugar.
Sanitizar la entrada
El ejemplo siguiente lee un campo name de una petición POST y escapa los caracteres especiales HTML para que el valor sea seguro de almacenar y mostrar posteriormente.
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($name === null) {
$name = ''; // field was not submitted at all
}
echo $name;FILTER_SANITIZE_FULL_SPECIAL_CHARS codifica en HTML cada carácter especial (similar a htmlspecialchars() con ENT_QUOTES), por lo que <b>Joe</b> se convierte en <b>Joe</b>.
Validar la entrada
Para campos con un formato fijo, valida en lugar de sanitizar. Aquí FILTER_VALIDATE_EMAIL devuelve la dirección en caso de éxito o false en caso de fallo:
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === null) {
echo "No email submitted.";
} elseif ($email === false) {
echo "Invalid email address.";
} else {
echo "Valid email: $email";
}Validar números con opciones
El cuarto parámetro permite restringir un valor. Este acepta un número de página entero solo cuando está entre 1 y 100, y recurre a 1 en caso contrario:
<?php
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 1,
'max_range' => 100,
'default' => 1, // returned when validation fails
],
]);
echo "Page: $page";Un ejemplo completo de formulario
En una petición real se lee cada campo directamente desde la fuente de entrada:
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120],
]);
$errors = [];
if ($email === false) {
$errors[] = 'Invalid email.';
}
if ($age === false) {
$errors[] = 'Age must be a whole number between 0 and 120.';
}
if ($errors) {
echo implode("\n", $errors);
} else {
echo "Name: $name\nEmail: $email\nAge: $age\n";
}Para un envío válido (name=<b>Jane</b>, [email protected], age=34) esto imprime:
Name: <b>Jane</b>
Email: [email protected]
Age: 34Nota:
filter_input()lee las variables que PHP capturó de la petición HTTP real, no los valores que posteriormente asignas a$_GET/$_POSTen el código. Esto la hace resistente a manipulaciones, pero también significa que la función devuelvenullpara cada campo cuando un script se ejecuta desde la línea de comandos sin ninguna petición detrás — prueba los filtros de entrada confilter_var()sobre una cadena de ejemplo en su lugar.
Cuándo usarla
Usa filter_input() siempre que un valor entre a tu aplicación desde el mundo exterior:
- Cadenas de consulta y formularios — obtén los campos
INPUT_GET/INPUT_POSTcon el validador adecuado en lugar de confiar en las superglobales en bruto. - Paginación, IDs, precios —
FILTER_VALIDATE_INT/FILTER_VALIDATE_FLOATcon un control de rango rechaza entradas fuera de límites o no numéricas antes de que lleguen a una consulta. - Formularios de contacto —
FILTER_VALIDATE_EMAILyFILTER_VALIDATE_URLimponen el formato en la frontera. Consulta el ejemplo detallado en Validación de formularios PHP.
Filtrar en la frontera de entrada mantiene la lógica de validación en un solo lugar y la separa de la lógica de negocio, lo que hace el código más fácil de leer, probar y auditar. Para la lista completa de filtros disponibles, consulta Filtros PHP.
Conclusión
filter_input() lee una variable externa y la filtra en un solo paso bien definido. Usa un filtro FILTER_VALIDATE_* cuando un campo tenga un formato estricto y un filtro FILTER_SANITIZE_* cuando solo necesites limpiar un valor, y comprueba siempre el retorno con === para distinguir una variable ausente (null) de una que falló (false).