Feed de Edgaragg

Artículos relacionados

Facebook Share

Share on facebook

Designed by:
SiteGround web hosting Joomla Templates
¿Cómo evitar la manipulación de código HTML? PDF Imprimir E-mail
Escrito por edgaragg   
Viernes, 24 de Abril de 2009 12:33

Hoy en día la mayoría de las aplicaciones web incluye el envío de información a través de formularios. Sin embargo, debido a la naturaleza "sin estado" del protocolo HTTP, los formularios tienen una gran debilidad, y es que un usuario cualquiera podría guardar la página, editar el código HTML y enviar el formulario al servidor con los datos modificados. 

Los usuarios que usan Firefox, pueden modificar también el código HTML usando el plugin Firebug, con este plugin puedes ver el código fuente de cualquier página y modificiarlo sin necesidad de almacenarlo en disco, por lo que puedes manipular el código HTML en una misma sesión.  Mi intención no es decir que Firebug es una herramienta nociva, todo lo contrario, me parece una gran herramienta para nosotros los desarrolladores, y si se usa en combinación con YSlow podemos mejorar la forma en que desarrollamos nuestros proyectos.

Entrando en el tema, muchas veces cuando creamos formularios tenermos que almacenar cierta información que nos permite identificar a que va asociado los datos que el usuario va a enviar.  Por ejemplo, supongamos que un usuario entra en una aplicación de e-commerce a hacer una compra.  Una vez que el usuario esté autenticado necesitaremos almacenar el ID del usuario en algun lugar.

Los desarrolladores podemos almacenar estos datos o en el lado del servidor o en el lado del cliente.  Si optamos por almacenarlos en el cliente, tenemos tres opciones:

  • En cookies
  • Como parte del URL
  • En campos ocultos

Cada una de estas opciones tiene sus ventajas y desventajas, sin embargo en este artículo me ocuparé de hablar de los campos ocultos, ya que esta técnica es bastante usada y muchas veces no nos damos cuenta de los agujeros de seguridad que dejamos en nuestra aplicación al usarlos.

Campos Ocultos

Los campos ocultos son campos que estan presentes en un formulario y que comunmente contienen información de sesión, pero no son mostrados al usuario. Estos campos son usados para almacenar información que debe ser enviada al servidor junto con el resto de los datos que el usuario llena, pero que no queremos que el usuario los pueda ver.

Manipulación del formulario

En muchos casos usamos estos campos para almacenar información como un ID.  Siguiendo el ejemplo anterior, supongamos que el usuario que está haciendo sus compras en la página de e-commerce cambiar su contraseña.  Se muestra la página con los datos del usuario pero necesitamos saber que usuario es el que estamos modificando.  Entonces lo que hacemos es crear un campo oculto con el ID del usuario.  De esta manera, cuando se envíen los datos al servidor, se pueda procesar el cambio al usuario en cuestion.

El código HTML se vería algo parecido a esto:

 

<input type="hidden" name="userid" value="1002">

Usando Firebug solamente tienes que seleccionar la pestaña HTML para ver el código fuente, y al seleccionar cualquier valor que este entre comillas este puede ser modificado.

 


 

En el ejemplo podemos cambiar el userid poniendo 1003 y el resultado sería que hemos cambiado la contraseña de otro usuario.

 

Uso del HTTP_REFERER

El HTTP_REFERER es un valor que se envía con cada petición en los encabezados.  Este valor contiene la dirección web de la página que el usuario visitó antes de la página actual.  En el ejemplo que hemos estado tratando, el HTTP_REFERER sería una página dentro del mismo dominio.

Muchos desarrolladores podrían pensar que el problema de manipulación del HTML se puede solucionar usando el HTTP_REFERER. En el caso en que alguien guardase la página en disco para cambiar el código HTML y enviarlo posteriormente, el valor de este encabezado sería un valor nulo.

Sin embargo, hemos visto que usando Firebug esto no funcionaría porque podemos cambiar el código HTML directamente sobre el navegador por lo que el valor del HTTP_REFERER permanece inalterado.

Además, todo el contenido que es enviado al servidor web es susceptible de ser modificado, y esto involucra también a los encabezados.  Alguien con un poco de conocimiento puede modificar el valor del HTTP_RERERER y engañar al servidor.

Es importante tener en cuenta al programar que cualquier cosa que se envie desde un navegador al servidor puede ser modificado, esto incluye los valores de los formularios, los encabezados e incluso las cookies.

¿Y cual podría ser la solución?

Particularmente mi solución es crear un campo oculto adicional que almacene una clave generada por un algoritmo de "digest".  Un algoritmo de digest genera una clave única a partir de ciertos datos, y dicha clave es prácticamente imposible de revertir, es decir, no se puede obtener los valores originales a partir de dicha clave.

Estos algoritmos también se conocen como algoritmos Hash.  Unos de los mas conocidos son MD5 y SHA-1.

La idea es concatenar los valores que se almacenan en los campos ocultos de alguna forma, tratando que dicha concatenación no sea trivial.  En el ejemplo sería aplicar el valor de hash sobre el userid.  El código HTML de nuestro ejemplo ahora lucirá así

<input type="hidden" name="userid" value="1002">
<input type="hidden" name="signature" value="YEST2/fXQRStvLhDXYpjF/xTLJp">

Cuando el usuario envía los datos al servidor, se válida la consistencia de los datos regenerando la clave pero esta vez usaremos los valores enviados desde el navegador y se compara el valor del hash generado con el enviado por el cliente, si estos son diferentes hemos detectado una manipulación del código HTML. 

 

En nuestro ejemplo aplicaremos de nuevo el algoritmo hash sobre el userid y se compara este valor con el campo "signature". Si un usuario cambia el valor del campo userid se generará otra clave de hash por lo que ya no coincidirá con la enviada por el navegador.  Sin embargo, todavia puede resultar relativamente fácil para alguien con suficientes conocimientos darse cuenta que estamos aplicando un algoritmo de hash sobre los valores ocultos, y con un poco de paciencia vulnerar la seguridad, ya que podría generar la clave para los valores que a manipulado.

Para proporcionar mayor seguridad, concatenaremos tambien una variable aleatoria generada únicamente para esa sesión y que residirá solamente en el servidor.  De esta manera, cuando entramos en la página una vez podremos ver en el código HTML una clave hash, pero si abrimos otra sesión y entramos a la misma página se habrá generado una clave diferente.

Lo bueno de este mismo método es que podríamos aplicarlo a las cookies también, proporcionando mayor seguridad a nuestras aplicaciones.

 

 

 

Actualizado ( Miércoles, 04 de Noviembre de 2009 09:19 )