HTTP Referer, útil e inseguro

Una de las cosas que valoro mucho es el ingenio. Usar cosas para realizar una tarea distinta de la que ha sido pensada siempre ha sido uno de mis pasatiempos favoritos. Ahora bien, hay que distinguir entre un “apaño”, una “curiosidad” y un “uso adecuado”. ¿A dónde quiero ir a parar? A que la gente debería leerse la documentación antes de hacer machadas :P

El protocolo HTTP tiene la característica de decirle a la web que estás visitando cuál es la última que has visitado, llamada HTTP Referer. Vamos, que las páginas saben de dónde vienes. Esto es una característica que a veces resulta útil, por ejemplo para evitar el “hot linking”. Es algo así como preguntarle al navegador “Oye, ¿de dónde vienes?”, tal cual. El navegador puede decirte la verdad, no responderte o mentirte, aunque como os podéis imaginar, la inmensa mayoría de los navegadores están configurados por defecto para responder con la verdad.

El problema viene cuando la gente usa esta característica para realizar sistemas de seguridad. Imaginemos el siguiente escenario:

La empresa PagoPoco tiene una zona pública con información de contacto, productos y servicios, etc… y una zona privada, digamos por ejemplo que todo el directorio “/private” con las páginas para descargarse los productos. Para acceder a esa zona privada, tienes que hacer login en una página que está en la zona pública (si estuviese en la privada sólo podrías acceder si ya estuvieses autenticado, y claro, tiene poca gracia autenticarse estando autenticado). Si el nombre de usuario y contraseña es válido, te lleva a “/login_success.php” si no, te devuelve a la página principal de la zona pública.

Un sistema que use HTTP Referer para implementar ese sistema podría tener una norma tal que así:

Si la última página visitada es de la forma “/private/*” o “login_success.php”, déjale pasar.

¿Tiene sentido no? El problema es que, como he dicho antes, el navegador puede mentir y decir que viene de “/prívate/meLoInventoPorqueMolo.php” o de “login_success.php” o de lo que le dé la gana… y claro, todo el sistema se vuelve una mierda :P

Os dejo un pequeñísimo programa con su código fuente (C#) que permite visitar la web que queráis y decir que venís de la web que queráis. Podéis probarlo http://www.stardrifter.org/cgi-bin/ref.cgi , en un navegador normal os dirá que venís de esta web, o si lo ponéis en una nueva ventana, que no venís de ningún sitio. Si usáis el programa que dejo, podéis especificar de dónde venís.

referer

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P