En PHP, la seguridad de los datos es crucial para prevenir vulnerabilidades como SQL Injection, XSS (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ón | Sanitizació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_EMAIL | Ej: FILTER_SANITIZE_STRING |
3. Filtros Más Útiles
Validación de datos comunes
Filtro | Descripción | Ejemplo |
---|---|---|
FILTER_VALIDATE_EMAIL | Verifica si es un email válido. | filter_var("[email protected]", FILTER_VALIDATE_EMAIL) |
FILTER_VALIDATE_URL | Comprueba si es una URL válida. | filter_var("https://example.com", FILTER_VALIDATE_URL) |
FILTER_VALIDATE_IP | Valida una dirección IPv4 o IPv6. | filter_var("192.168.1.1", FILTER_VALIDATE_IP) |
FILTER_VALIDATE_INT | Verifica si es un número entero. | filter_var(42, FILTER_VALIDATE_INT) |
Sanitización de datos peligrosos
Filtro | Descripción | Ejemplo |
---|---|---|
FILTER_SANITIZE_STRING (OBSOLETO en PHP 8.1+) | Elimina etiquetas HTML. | filter_var("<script>alert('XSS')</script>", FILTER_SANITIZE_SPECIAL_CHARS) |
FILTER_SANITIZE_EMAIL | Elimina caracteres no válidos en emails. | filter_var("user@<script>example.com", FILTER_SANITIZE_EMAIL) |
FILTER_SANITIZE_URL | Limpia URLs eliminando caracteres peligrosos. | filter_var("https://<script>example.com", FILTER_SANITIZE_URL) |
FILTER_SANITIZE_NUMBER_INT | Solo 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 <script>
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()
.