Saltar al contenido principal

Validación de datos

Cuando una aplicación recibe datos del usuario (por ejemplo, desde un formulario HTML o a través de parámetros en la URL), no se puede asumir que esos datos son correctos o seguros.

Un usuario podría (de forma intencionada o por error) enviar información no válida, malformada o incluso maliciosa (como intentos de inyección SQL o scripts JavaScript). Por eso, validar los datos significa comprobar que cumplen con los requisitos esperados antes de usarlos en el programa.

Esto mejora:

  • La seguridad de la aplicación.
  • La fiabilidad del código.
  • La experiencia del usuario, al detectar errores antes de procesar datos incorrectos.

Métodos principales de validación en PHP

PHP ofrece varias herramientas para validar los datos que llegan mediante $_GET, $_POST u otros métodos.

Las más utilizadas son filter_input y filter_var. Estas funciones usan el sistema de filtros de PHP, que permite validar o limpiar datos de forma sencilla y segura.

También existen sus versiones para arrays: filter_input_array y filter_var_array.

filter_input()

Permite acceder directamente a las variables de entrada ($_GET, $_POST, $_COOKIE, etc.) aplicando un filtro de validación o saneamiento.

filter_input(tipo_de_entrada, nombre_de_variable, filtro, opciones);

Este método devuelve:

  • false → el valor existe, pero no pasa la validación (por ejemplo, FILTER_VALIDATE_INT y el valor no es un número).
  • null → la variable no existe o no se envió en la petición.
Validación o saneamiento
  • Validación es comprobar que los datos cumplen ciertas reglas.
  • Saneamiento es limpiar los datos antes de usarlos.

Ejemplo:

<?php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

if ($id) {
echo "ID válido: $id";
} else {
echo "El parámetro 'id' no es un número válido.";
}
?>

En este ejemplo, si el usuario accede a la URL pagina.php?id=10 la variable $id tomará el valor 10.

Si escribe algo no numérico (id=hola), el filtro fallará y devolverá false.

filter_var()

Esta función se usa cuando ya tienes el valor en una variable y quieres validarlo.

Ejemplo:

<?php
$email = $_POST['email'] ?? '';

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Correo válido.";
} else {
echo "Correo no válido.";
}
?>

Validación manual

A veces, se necesita validar con reglas personalizadas, por ejemplo, comprobar la longitud de un texto o aplicar una expresión regular.

Ejemplo:

<?php
$usuario = $_POST['usuario'] ?? '';

if (strlen($usuario) < 3 || strlen($usuario) > 20) {
echo "El nombre de usuario debe tener entre 3 y 20 caracteres.";
} elseif (!preg_match("/^[a-zA-Z0-9_]+$/", $usuario)) {
echo "El nombre de usuario solo puede contener letras, números y guiones bajos.";
} else {
echo "Usuario válido.";
}
?>
$usuario = $_POST['usuario'] ?? '';

function validarNombre(string $nombre): bool {
return preg_match("/^[a-zA-ZáéíóúÁÉÍÓÚñÑ\s]{3,40}$/", $nombre);
}

if (validarNombre($usuario)) {
echo "El nombre es válido.";
} else {
echo "El nombre no es válido.";
}
$password = $_POST['password'] ?? '';

function validarPassword(string $pass): bool {
return preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$/', $pass);
}

if (validarPassword($password)) {
echo "La contraseña es segura.";
} else {
echo "La contraseña no es segura.";
}

Filtros predeterminados

A continuación, se muestran algunos filtros comunes para validación en PHP.

FILTER_VALIDATE_INT

Valida que sea un número entero:

filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
filter_var($id, FILTER_VALIDATE_INT);

FILTER_VALIDATE_EMAIL

Comprueba si es un correo válido:

filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
filter_var($email, FILTER_VALIDATE_EMAIL);

FILTER_VALIDATE_URL

Verifica si es una URL correcta:

filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL);
filter_var($url, FILTER_VALIDATE_URL);

Comprobación de existencia de variables

En ocasiones necesitamos comprobar si una variable ha sido enviada por el usuario antes de procesarla.

Para ello, PHP ofrece la función isset(), que devuelve true si una variable está definida y no es null, y false en caso contrario.

Ejemplo:

if (isset($_POST['nombre'])) {
echo "El campo 'nombre' ha sido enviado.";
} else {
echo "El campo 'nombre' no existe en la petición.";
}

Esta comprobación es útil cuando sólo queremos saber si una variable existe, sin aplicar ningún tipo de validación o filtrado.

Las funciones filter_input() y filter_var() ya realizan internamente una comprobación de existencia del valor, por lo que no es necesario usar isset() junto a ellas.

Buenas prácticas

  • Nunca confíes en los datos del usuario. Todo lo que venga de $_GET, $_POST, $_COOKIE o incluso $_FILES debe ser validado.
  • Usa siempre filtros adecuados al tipo de dato (por ejemplo, FILTER_VALIDATE_INT para números).
  • Combina validación y saneamiento.
  • Proporciona mensajes de error claros al usuario cuando algo no sea válido.
  • Centraliza la validación: si tu proyecto crece, crea una clase o función específica para validar datos.

Ejemplo completo

formulario.html
<form method="POST" action="procesar.php">
Email: <input type="email" name="email">
Edad: <input type="number" name="edad">
<button type="submit">Enviar</button>
</form>
procesar.php
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$edad = filter_input(INPUT_POST, 'edad', FILTER_VALIDATE_INT);

if ($email === false) {
echo "El correo electrónico no es válido.<br>";
}

if ($edad === false || $edad < 0) {
echo "La edad debe ser un número positivo.<br>";
}

if ($email !== false && $edad !== false && $edad >= 0) {
echo "Datos correctos: $email, $edad años.";
}
?>