Tema 4

4. Validación de entradas, sanitización y manejo seguro de datos

Toda aplicación web procesa datos que provienen de usuarios, navegadores, APIs, archivos o servicios externos. La seguridad depende en gran parte de cómo esos datos se validan, transforman, almacenan y devuelven. Tratar toda entrada como no confiable es una de las reglas más importantes del desarrollo seguro.

Objetivo Aprender a procesar entradas de forma segura
Enfoque Práctico, defensivo y orientado al servidor
Resultado Evitar errores que abren la puerta a múltiples vulnerabilidades

4.1 Introducción

Una aplicación web recibe datos de muchas fuentes: formularios, URLs, cookies, cabeceras, parámetros JSON, archivos subidos por usuarios, webhooks, integraciones con terceros y valores guardados previamente en bases de datos. Desde la seguridad, todos esos datos deben considerarse potencialmente peligrosos hasta que la aplicación demuestre lo contrario.

Este principio es central porque muchas vulnerabilidades dependen justamente de procesar datos no confiables como si fueran válidos. Inyecciones, XSS, errores de lógica, deserialización peligrosa, abuso de funciones y exposición de información suelen comenzar con una entrada mal tratada.

Por eso la validación de entradas no es un detalle de programación. Es una frontera crítica entre el exterior y la lógica interna del sistema.

4.2 Qué significa que una entrada no es confiable

Decir que una entrada no es confiable no significa que siempre sea maliciosa. Significa que la aplicación no debe asumir automáticamente que tiene el formato correcto, que pertenece al usuario adecuado, que respeta el flujo de negocio o que puede usarse sin controles adicionales.

Una entrada puede ser peligrosa por varias razones:

  • El usuario puede alterarla manualmente.
  • El navegador puede ser manipulado.
  • Un atacante puede automatizar solicitudes personalizadas.
  • Un servicio externo puede enviar datos defectuosos o inesperados.
  • Un dato antiguo almacenado en la base también puede ser usado como vector de ataque.
En seguridad web no solo es peligrosa la entrada que llega desde internet. También puede serlo la que vuelve desde la base de datos si antes fue guardada sin control.

4.3 Fuentes comunes de entrada en una aplicación web

Para validar bien, primero hay que saber de dónde llegan los datos.

Fuente Ejemplos Riesgos típicos
URL y query string IDs, filtros, búsquedas, paginación Manipulación de parámetros, acceso indebido, inyecciones
Formularios Registro, login, comentarios, contacto Datos inesperados, scripts, valores fuera de rango
Cabeceras y cookies Sesión, idioma, agente, origen Suplantación, sesión insegura, confianza indebida
Cuerpo JSON o XML APIs, móviles, SPAs Estructuras alteradas, tipos inválidos, objetos inesperados
Archivos Imágenes, PDFs, planillas, adjuntos Contenido malicioso, tamaño excesivo, tipo falso
Servicios externos Pagos, webhooks, autenticación federada Datos inconsistentes o firmas mal verificadas

4.4 Validar no es solo comprobar que "no venga vacío"

Uno de los errores más comunes es pensar que validar consiste únicamente en revisar si un campo existe o si tiene una longitud mínima. En realidad, validar bien implica definir con precisión qué forma correcta debe tener un dato para un contexto particular.

Una validación robusta puede incluir:

  • Tipo esperado.
  • Longitud mínima y máxima.
  • Formato permitido.
  • Rango de valores aceptable.
  • Conjunto de opciones válidas.
  • Relación coherente con otros campos.
  • Compatibilidad con el estado actual del negocio.

Por ejemplo, validar un email no es lo mismo que validar un precio, un identificador interno, una fecha de nacimiento o un monto de transferencia.

4.5 Estrategia recomendada: permitir solo lo esperado

En seguridad, suele ser más seguro definir qué entradas están permitidas que intentar adivinar todo lo que podría ser peligroso. Esta idea suele llamarse enfoque de lista permitida o allowlist.

Por ejemplo:

  • Si un campo debe contener un entero positivo, se acepta solo ese formato.
  • Si un estado puede ser `pendiente`, `pagado` o `cancelado`, no deberían admitirse otros valores.
  • Si un nombre de usuario permite letras, números y guiones bajos, el sistema debe rechazar cualquier otra cosa.

Este enfoque es más robusto que filtrar caracteres "sospechosos", porque los ataques reales suelen encontrar formas de saltar bloqueos incompletos.

4.6 Validación en cliente y validación en servidor

La validación del lado cliente, por ejemplo con JavaScript o controles HTML, es útil para mejorar experiencia del usuario. Reduce errores simples y permite dar feedback inmediato. Pero no es una barrera de seguridad suficiente.

La razón es directa: el atacante controla el cliente. Puede desactivar JavaScript, modificar el formulario, construir peticiones manuales o usar herramientas para enviar datos arbitrarios. Por eso la validación que realmente protege debe ejecutarse en el servidor.

La regla práctica es esta:

  • La validación en cliente mejora usabilidad.
  • La validación en servidor protege la aplicación.

4.7 Validación sintáctica y validación semántica

Para razonar mejor sobre entradas conviene separar dos niveles de validación.

  • Validación sintáctica: verifica forma y estructura del dato.
  • Validación semántica: verifica que el dato tenga sentido en el contexto del negocio.

Ejemplo:

  • Una fecha con formato `2026-04-18` puede ser sintácticamente válida.
  • Pero puede ser semánticamente inválida si representa una reserva en el pasado cuando el flujo solo admite fechas futuras.

Muchas aplicaciones validan solo la forma del dato y olvidan validar si ese dato corresponde al estado real del sistema.

4.8 Sanitización: qué es y cuándo usarla

Sanitizar consiste en transformar una entrada para eliminar, neutralizar o normalizar contenido peligroso antes de usarla en un contexto determinado. Esto puede ser útil, pero debe entenderse bien: sanitizar no reemplaza validar.

Por ejemplo, si un campo admite texto libre para comentarios, puede ser razonable limpiarlo o normalizarlo antes de mostrarlo en HTML. Pero si un campo debería contener un número de documento, lo correcto no es "sanitizarlo hasta que pase", sino rechazar lo que no cumpla la regla esperada.

Validar responde: "¿este dato es aceptable para este campo?". Sanitizar responde: "si este dato es aceptable, ¿cómo lo transformo para usarlo con seguridad?".

4.9 Escapar salida no es lo mismo que sanitizar entrada

Otro error frecuente es mezclar sanitización con escape de salida. Escapar salida significa codificar datos al momento de incluirlos en un contexto específico, por ejemplo HTML, atributos, JavaScript, CSS o URLs, para evitar que sean interpretados como instrucciones.

Esto es clave para prevenir XSS. Incluso si un dato ya fue validado al ingresar, cuando se muestra debe tratarse según el contexto de salida.

La idea importante es que la seguridad completa suele requerir varias capas:

  • Validar lo que entra.
  • Procesar con reglas seguras.
  • Escapar o codificar correctamente lo que sale.

4.10 Normalización de datos

Antes de validar o comparar valores, muchas aplicaciones necesitan normalizar entradas. Esto implica transformar datos a una forma consistente para evitar errores lógicos o bypass de controles.

Ejemplos comunes:

  • Eliminar espacios extra al inicio o al final.
  • Unificar mayúsculas y minúsculas cuando el negocio lo permite.
  • Convertir formatos de fecha o números a una representación interna estable.
  • Resolver codificaciones y variantes Unicode relevantes.

La normalización importa porque un atacante puede intentar aprovechar diferencias de representación para saltar filtros o comparaciones.

4.11 Datos estructurados y esquemas

Cuando la aplicación recibe JSON, XML o formularios complejos, conviene validar contra un esquema o contrato claro. Eso ayuda a limitar campos inesperados, tipos incorrectos y estructuras no previstas.

En APIs modernas, por ejemplo, no alcanza con verificar que el cuerpo tenga "algo". Debe definirse:

  • Qué campos son obligatorios.
  • Qué tipo tiene cada campo.
  • Qué valores son válidos.
  • Qué campos extra deben rechazarse o ignorarse con criterio.

Este enfoque reduce ambigüedad y evita que la lógica de negocio procese objetos arbitrarios.

4.12 Manejo seguro de identificadores

Muchos flujos web dependen de identificadores: IDs de usuarios, pedidos, facturas, cursos, mensajes o archivos. Desde la seguridad, estos valores deben tratarse con cuidado porque suelen ser manipulables.

Un error frecuente es validar que el identificador tenga "formato correcto", pero olvidar comprobar si el usuario autenticado realmente tiene permiso para acceder a ese recurso. Eso deriva en problemas como IDOR o control de acceso roto.

Por lo tanto, para un identificador no basta con validar tipo o formato. También debe verificarse contexto y autorización.

4.13 Manejo de texto libre

Los campos de texto libre, como comentarios, descripciones, mensajes o publicaciones, son especialmente delicados porque por definición admiten mucha variabilidad. En estos casos la aplicación debe decidir con claridad qué quiere permitir.

  • Si solo se espera texto plano, conviene tratarlo como texto plano y escapar salida correctamente.
  • Si se admite un subconjunto de HTML, se necesita una sanitización robusta diseñada específicamente para ese caso.
  • Si no se necesita markup, permitirlo suele agregar riesgo sin aportar valor.

La pregunta correcta no es "¿cómo limpio todo HTML peligroso?" sino "¿realmente necesito aceptar HTML aquí?".

4.14 Archivos y datos binarios

La subida de archivos merece atención especial porque un archivo no es solo un nombre y una extensión. Puede contener contenido activo, formatos maliciosos, tamaños problemáticos o tipos engañosos.

Un manejo seguro suele requerir:

  • Limitar tamaño máximo.
  • Restringir tipos permitidos.
  • No confiar solo en la extensión.
  • Validar tipo real o procesarlo en entornos controlados.
  • Renombrar el archivo del lado servidor.
  • Evitar que quede ejecutable o servido desde rutas peligrosas.

4.15 Datos sensibles y minimización

El manejo seguro de datos no solo implica validar. También implica preguntarse si realmente hace falta recibir, guardar o mostrar cierta información. Cuantos más datos sensibles procesa una aplicación, mayor es su superficie de riesgo.

La minimización es un principio muy útil:

  • Recibir solo lo necesario.
  • Guardar solo lo necesario.
  • Mostrar solo lo necesario.
  • Conservar solo durante el tiempo necesario.

En muchos casos, la mejor defensa no es proteger mejor un dato innecesario, sino dejar de procesarlo.

4.16 Errores comunes al procesar entradas

  • Confiar solo en validación del frontend.
  • Usar expresiones regulares sin entender casos límite.
  • Eliminar algunos caracteres "peligrosos" y asumir que eso resuelve el problema.
  • Aceptar campos extra en APIs sin revisar impacto.
  • No validar longitud ni tamaño de contenido.
  • Guardar datos no confiables y mostrarlos después sin escape adecuado.
  • Confundir autorización con validación de formato.
Muchos sistemas fallan no por ausencia total de validación, sino por validaciones parciales aplicadas en unos flujos y olvidadas en otros.

4.17 Ejemplos prácticos de validación correcta e incorrecta

Escenario Mala práctica Mejor enfoque
Campo edad Aceptar cualquier texto y luego intentar convertir Exigir entero dentro de un rango razonable
ID de factura Verificar que sea número y devolver la factura Validar formato y además propiedad o permiso sobre ese recurso
Comentario público Guardar HTML sin control y renderizarlo directamente Tratar como texto o sanitizar con política definida y escapar salida
API de actualización Aceptar cualquier campo que el cliente envíe Definir esquema estricto y rechazar estructuras no previstas

4.18 Relación con otras vulnerabilidades

La validación de entradas y el manejo seguro de datos están conectados con muchas otras categorías de seguridad:

  • Inyección: aparece cuando datos no confiables alcanzan consultas o comandos sin control adecuado.
  • XSS: aparece cuando datos no confiables se incluyen en salidas sin escape o sanitización correcta.
  • Control de acceso roto: aparece cuando un identificador válido se usa sin verificar autorización.
  • Fallas de lógica: aparecen cuando el dato tiene forma válida, pero no debería ser aceptado en ese estado del negocio.

Por eso este tema es transversal a gran parte del curso.

4.19 Diseño de errores y mensajes seguros

Cuando una validación falla, la aplicación debe reaccionar de forma clara para el usuario pero sin revelar información sensible ni detalles internos innecesarios. Un buen mensaje orienta la corrección del dato; un mal mensaje expone lógica interna, nombres de tablas, trazas o reglas de negocio excesivamente detalladas.

En seguridad, el manejo de errores también forma parte del procesamiento seguro de entradas.

4.20 Qué debes recordar de este tema

  • Toda entrada debe considerarse no confiable hasta validarla en el servidor.
  • Validar, sanitizar y escapar salida son tareas distintas y complementarias.
  • La mejor estrategia suele ser permitir solo lo esperado en lugar de intentar bloquear lo peligroso.
  • La validación debe incluir forma, rango, coherencia y contexto de negocio.
  • Muchos problemas de seguridad nacen por procesar datos no confiables sin reglas claras.

4.21 Conclusión

La validación de entradas, la sanitización y el manejo seguro de datos forman una de las bases más importantes de la seguridad en aplicaciones web. No son controles aislados, sino una disciplina continua que atraviesa formularios, APIs, archivos, integraciones y respuestas al usuario.

En el próximo tema estudiaremos una consecuencia directa de procesar datos de forma insegura: las fallas de inyección, incluyendo SQL Injection, NoSQL Injection y comandos del sistema.