Validación de los datos de entrada

LIBP-0255 (Libro de pautas)

Asegurar que los datos de entrada no contienen código malicioso que pueda alterar el correcto funcionamiento de la aplicación

Existen varias fuentes de entrada de datos:

  • Cabeceras HTTP.
  • Variables de Entorno o sesión.
  • Todas las peticiones GET / POST e información en Cookies.

Esto incluye campos supuestamente resistentes a ser manipulados como botones de opción múltiple, listas desplegables, etc. En general, cualquier código HTML que se encuentre del lado del cliente puede ser sobrescrito para que haga lo que el atacante quiera.

Los datos recibidos de una entrada no confiable deben ser revisados apropiadamente antes de utilizarse por primera vez.

Pautas

TítuloCarácter
Validaciones en el servidor Obligatoria
Utilizar listas blancasRecomendada
Utilizar listas negrasRecomendada
Escapado de caracteresObligatoria
Construcción de cabeceras HTTPObligatoria

Validaciones en el servidor

Validar los parámetros de entrada siempre en el servidor antes de procesarlos

La validación en el cliente, no proporciona ninguna protección para el servidor. Un atacante puede utilizar varias técnicas (como desactivar JavaScript, utilizar telnet, o utilizar un proxy de pruebas de seguridad, tales como WebScarab) para omitir la validación del lado del cliente.

La validación en el cliente está muy extendida, pero no es completamente segura. La única ventaja de la validación en el cliente, desde una perspectiva de seguridad, es que la detección de intrusos puede ser más eficaz, debido a que sólo los usuarios de entrada prevalidados deben llegar al servidor.

Utilizar listas blancas

Rechazar cualquier entrada que no corresponda estrictamente a las especificaciones.

Es recomendable utilizar una estrategia de validación de entrada "aceptar buena conocida", es decir, aceptar las entradas que cumpla estrictamente con las especificaciones. Rechazar cualquier entrada que no corresponda estrictamente a las especificaciones, o transformarlo en algo que lo haga.

Utilizar listas negras

Rechazar cualquier entrada que corresponda con alguno de los elementos de la lista

Mediante la ultilización de listas negras se consigue excluir todas aquellas entradas maliciosas o mal formadas

Escapado de caracteres

Cambiar un caracter propio del lenguaje por su correpondiente codificación

Escapar caracteres permite librarnos de caracteres específicos propios de los lenguajes de programación que pueden ser interpretados por el lenguaje y producir alteraciones en el correcto funcionamiento de nuestra aplicación. Un <alert> de javascript sería codificado como %3Calert%3E no pudiendo ser interpretado por la página html.

A continuación se enumeran alguno caracteres y sus escapados:

< %3C > %3E
# %23 % %25
{ %7B } %7D
| %7C \ %5C
^ %5E ~ %7E
[ %5B ] %5D
` %60 ; %3B
/ %2F ? %3F
: %3A @ %40
= %3D & %26

Construcción de cabeceras HTTP

No construir encabezados HTTP con datos de entrada no validados.

La construcción de encabezados HTTP debe realizarse con datos de entrada validados ya que un atacante puede llegar a conocer la respuesta que da el servidor, y cometer algún ataque como el cross-site scripting o envenenamiento de caché contra el sistema