Validación y Sanitización de Datos en PHP con filter_var()

Validación y Sanitización de Datos en PHP con filter_var()

En PHP, la seguridad de los datos es crucial para prevenir vulnerabilidades como SQL InjectionXSS (Cross-Site Scripting) y otros ataques comunes. Una de las formas más eficientes y nativas de validar y sanitizar datos es usando la función filter_var().

En este artículo, aprenderás:
✅ Qué es filter_var() y por qué usarlo
✅ Diferencias entre validación y sanitización
✅ Filtros más útiles para formularios, emails y URLs
✅ Ejemplos prácticos de uso


1. ¿Qué es filter_var()?

filter_var() es una función de PHP que permite validar y sanitizar datos aplicando filtros predefinidos. Es más seguro que funciones obsoletas como htmlspecialchars() o expresiones regulares complejas en algunos casos.

Sintaxis básica:

php

filter_var($valor, $filtro, $opciones);
  • $valor: Dato a filtrar (ej: $_POST['email']).
  • $filtro: Tipo de filtro a aplicar (ej: FILTER_VALIDATE_EMAIL).
  • $opciones (opcional): Configuraciones adicionales.

2. Validación vs. Sanitización

ValidaciónSanitización
Verifica si un dato cumple ciertas reglas (ej: un email válido).Limpia el dato, eliminando caracteres peligrosos.
Devuelve false si no es válido.Devuelve el dato modificado.
Ej: FILTER_VALIDATE_EMAILEj: FILTER_SANITIZE_STRING

3. Filtros Más Útiles

Validación de datos comunes

FiltroDescripciónEjemplo
FILTER_VALIDATE_EMAILVerifica si es un email válido.filter_var("[email protected]", FILTER_VALIDATE_EMAIL)
FILTER_VALIDATE_URLComprueba si es una URL válida.filter_var("https://example.com", FILTER_VALIDATE_URL)
FILTER_VALIDATE_IPValida una dirección IPv4 o IPv6.filter_var("192.168.1.1", FILTER_VALIDATE_IP)
FILTER_VALIDATE_INTVerifica si es un número entero.filter_var(42, FILTER_VALIDATE_INT)

Sanitización de datos peligrosos

FiltroDescripciónEjemplo
FILTER_SANITIZE_STRING (OBSOLETO en PHP 8.1+)Elimina etiquetas HTML.filter_var("<script>alert('XSS')</script>", FILTER_SANITIZE_SPECIAL_CHARS)
FILTER_SANITIZE_EMAILElimina caracteres no válidos en emails.filter_var("user@<script>example.com", FILTER_SANITIZE_EMAIL)
FILTER_SANITIZE_URLLimpia URLs eliminando caracteres peligrosos.filter_var("https://<script>example.com", FILTER_SANITIZE_URL)
FILTER_SANITIZE_NUMBER_INTSolo deja números enteros.filter_var("a1b2c3", FILTER_SANITIZE_NUMBER_INT) → 123

4. Ejemplos Prácticos

Validar un formulario de contacto

php

$email = $_POST['email'] ?? '';
$url = $_POST['website'] ?? '';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "El email no es válido";
    } elseif (!filter_var($url, FILTER_VALIDATE_URL)) {
    echo "La URL no es válida";
    } else {
    echo "Datos correctos, procesando...";
    }

Sanitizar una entrada para evitar XSS

$comentario = $_POST['comentario'] ?? '';
$comentario_limpio = filter_var($comentario, FILTER_SANITIZE_SPECIAL_CHARS);

echo $comentario_limpio; // Convierte <script> en &lt;script&gt;

Validar y sanitizar un número entero

php

$edad = $_POST['edad'] ?? '';
$edad_limpia = filter_var($edad, FILTER_SANITIZE_NUMBER_INT);
if (filter_var($edad_limpia, FILTER_VALIDATE_INT, ["options" => ["min_range" => 18, "max_range" => 99]])) {
    echo "Edad válida: $edad_limpia";
    } else {
    echo "Edad debe ser entre 18 y 99";
    }

5. Conclusión

✅ filter_var() es una herramienta poderosa para validar y sanitizar datos.
✅ Reduce riesgos de inyección de código y ataques XSS.
✅ Es más seguro que funciones antiguas como mysql_real_escape_string().