W3docs

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, consulta filter_input_array().

Sintaxis

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
ParámetroRequeridoDescripción
$typeLa fuente de entrada: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV.
$var_nameEl nombre de la variable a leer, p. ej. 'email'.
$filterNoUn ID de filtro como FILTER_VALIDATE_EMAIL. Por defecto es FILTER_DEFAULT (sin filtrado).
$optionsNoUn 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;
  • false si el filtrado (validación) falla;
  • null si 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 o false en caso de fallo. Úsalo cuando el campo tiene una forma estricta (email, entero, URL, booleano).

FILTER_SANITIZE_STRING fue eliminado en PHP 8.0. Usa FILTER_SANITIZE_FULL_SPECIAL_CHARS (o htmlspecialchars() 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 &lt;b&gt;Joe&lt;/b&gt;.

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:  &lt;b&gt;Jane&lt;/b&gt;
Email: [email protected]
Age:   34

Nota: filter_input() lee las variables que PHP capturó de la petición HTTP real, no los valores que posteriormente asignas a $_GET/$_POST en el código. Esto la hace resistente a manipulaciones, pero también significa que la función devuelve null para cada campo cuando un script se ejecuta desde la línea de comandos sin ninguna petición detrás — prueba los filtros de entrada con filter_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_POST con el validador adecuado en lugar de confiar en las superglobales en bruto.
  • Paginación, IDs, preciosFILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT con un control de rango rechaza entradas fuera de límites o no numéricas antes de que lleguen a una consulta.
  • Formularios de contactoFILTER_VALIDATE_EMAIL y FILTER_VALIDATE_URL imponen 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).

Práctica

Práctica
¿Cuáles de las siguientes funciones PHP se utilizan para sanitizar y validar formularios?
¿Cuáles de las siguientes funciones PHP se utilizan para sanitizar y validar formularios?
Was this page helpful?