🧨 ¿Por qué validar los datos es crucial?
Todo lo que entra a tu app puede ser un vector de ataque. Desde un nombre de usuario hasta una imagen cargada, cada input puede contener un intento de inyección, XSS, o incluso un exploit más sofisticado.
Los atacantes aprovechan errores en la validación para colarse. Y como desarrollador, validar correctamente es la primera línea de defensa.
🛠️ Tipos de validación
Tipo | ¿Dónde se realiza? | ¿Es segura por sí sola? |
---|---|---|
Del lado cliente | En el navegador | ❌ No (puede ser modificada fácilmente) |
Del lado servidor | En el backend (PHP, Node, etc.) | ✅ Sí (es la única que no se puede evitar) |
🔒 Regla de oro: la validación del lado cliente es útil, pero la del lado servidor es obligatoria.
📋 ¿Qué debes validar exactamente?
- Tipo de dato
¿Esperas un número? Asegúrate de que lo sea, no una cadena tipo"1; DROP TABLE users;"
. - Longitud máxima y mínima
Protege tus campos de overflow o abusos. - Formato
Usa expresiones regulares para verificar emails, teléfonos, DNI, URLs. - Lista blanca
Mejor validar por lo que sí aceptas que por lo que quieres evitar. - Valores permitidos
Por ejemplo:sexo = ['M', 'F']
, nosexo = input()
sin restricción.
⚠️ Casos reales de errores por falta de validación
1. XSS en formulario de comentarios
Un usuario malicioso envía:
htmlCopiarEditar<script>alert('Hackeado');</script>
Si ese comentario se muestra sin escapar, tu sitio está comprometido.
🔒 Solución: sanitizar el contenido antes de mostrarlo en HTML.
2. Upload de archivos maliciosos
Permitir subir archivos sin validar el tipo puede permitir cargar un .php
como imagen.
🔒 Solución:
- Verifica MIME type y extensión.
- Usa
getimagesize()
en PHP. - Re-nombra el archivo y guárdalo fuera del directorio público.
🧰 Herramientas y funciones por lenguaje
Lenguaje | Funciones / Librerías seguras |
---|---|
PHP | filter_var() , htmlspecialchars() , preg_match() |
JavaScript | validator.js , DOMPurify |
Python | WTForms , Cerberus , validaciones con Django |
Node.js | express-validator , Joi , yup |
📌 Ejemplo en PHP:
phpCopiarEditar$nombre = filter_input(INPUT_POST, 'nombre', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
📌 Ejemplo en Express (Node.js):
javascriptCopiarEditarapp.post('/api/user', [
check('email').isEmail(),
check('edad').isInt({ min: 18 })
], (req, res) => { ... });
🛡️ Validación en APIs
Las APIs no tienen formularios visuales, pero reciben datos de cualquier lado, y eso las hace especialmente vulnerables.
🔐 Buenas prácticas:
- Usa JSON Schema o librerías de validación por tipo.
- No asumas que el frontend siempre enviará los datos correctamente.
- Devuelve errores estructurados (ej: código 400 con mensaje de error).
- Valida longitud, tipo, y campos obligatorios.
📦 Ejemplo de validación en Laravel API:
phpCopiarEditar$request->validate([
'email' => 'required|email',
'edad' => 'required|integer|min:18',
]);
📚 Formas de validar listas y selects
Nunca confíes en que el usuario eligió una opción válida de un <select>
.
✅ Lista blanca en código:
phpCopiarEditar$permisos = ['admin', 'editor', 'usuario'];
if (!in_array($_POST['rol'], $permisos)) {
exit('Rol no permitido');
}
📊 Tabla de errores comunes por tipo de dato
Tipo de dato | Error típico | Solución recomendada |
---|---|---|
Texto | XSS, caracteres especiales | htmlspecialchars() o sanitización manual |
Números | Inyección SQL, bypass de lógica | is_numeric() y validación de rango |
Fechas | Formato incorrecto, ataques por fecha | Validar formato + usar strtotime() |
Archivos | MIME falso, extensión alterada | Validación doble (extensión + contenido) |
🧠 Validación avanzada con expresiones regulares
Una expresión regular puede ayudarte a limitar con precisión qué se permite en cada campo.
📌 Validar un nombre sin números ni símbolos:
phpCopiarEditarif (!preg_match("/^[a-zA-ZáéíóúÁÉÍÓÚñÑ ]+$/", $nombre)) {
exit('Nombre inválido');
}
📌 Validar un DNI peruano (8 dígitos):
phpCopiarEditarif (!preg_match("/^[0-9]{8}$/", $dni)) {
exit('DNI inválido');
}
🔒 Recomendaciones de seguridad extra
- Usa captchas para evitar spam automatizado.
- Rechaza peticiones sin cabecera
Content-Type
válida. - No confíes en
JavaScript required
para evitar que se salten reglas. - Usa logs para detectar entradas sospechosas repetidas.
📚 Recursos Recomendados (Formato Redescarga)
Tipo | Enlace / Recurso |
---|---|
📘 Guía | Input Validation Cheat Sheet – OWASP |
🎥 Video | «API Input Validation Best Practices» – Traversy Media |
🛠️ Herramienta | Postman para testear entradas de forma segura |
🧪 Test | FuzzDB – diccionario de payloads maliciosos |
✅ Conclusión
La validación de datos es como un filtro de agua: si no funciona bien, todo lo que entra puede contaminar tu sistema.
Aprender a validarlos correctamente no solo evita errores, te protege de amenazas reales y frecuentes.
💡 Asegúrate de tener reglas claras y específicas para cada campo en tus formularios y tus APIs, y jamás des por hecho que el frontend se comportará bien.
Deja una respuesta