Validación de Datos en Formularios y APIs – Cómo Blindar tus Entradas

abril 5, 2025

🧨 ¿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 clienteEn el navegador❌ No (puede ser modificada fácilmente)
Del lado servidorEn 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?

  1. Tipo de dato
    ¿Esperas un número? Asegúrate de que lo sea, no una cadena tipo "1; DROP TABLE users;".
  2. Longitud máxima y mínima
    Protege tus campos de overflow o abusos.
  3. Formato
    Usa expresiones regulares para verificar emails, teléfonos, DNI, URLs.
  4. Lista blanca
    Mejor validar por lo que sí aceptas que por lo que quieres evitar.
  5. Valores permitidos
    Por ejemplo: sexo = ['M', 'F'], no sexo = 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

LenguajeFunciones / Librerías seguras
PHPfilter_var(), htmlspecialchars(), preg_match()
JavaScriptvalidator.js, DOMPurify
PythonWTForms, Cerberus, validaciones con Django
Node.jsexpress-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 datoError típicoSolución recomendada
TextoXSS, caracteres especialeshtmlspecialchars() o sanitización manual
NúmerosInyección SQL, bypass de lógicais_numeric() y validación de rango
FechasFormato incorrecto, ataques por fechaValidar formato + usar strtotime()
ArchivosMIME falso, extensión alteradaValidació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)

TipoEnlace / Recurso
📘 GuíaInput Validation Cheat Sheet – OWASP
🎥 Video«API Input Validation Best Practices» – Traversy Media
🛠️ HerramientaPostman para testear entradas de forma segura
🧪 TestFuzzDB – 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.

Comentarios 0

Deja una respuesta

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados *