Que es CSRF, por que es peligroso y como proteger tu código.

CSRF significa Cross-Site Request Forgery, esta es una vulnerabilidad que puede existir en cualquier lenguaje de programación y en cualquier programa en el que no se ha tomado medidas para prevenirlo. En este tipo de ataques alguien genera un enlace con información que puede hacer que realices una acción sin tu consentimiento en algún sistema en el que ya te hayas autenticado.

CSRF busca modificar información, por ejemplo cambiar algún dato como tu dirección de email, hacer una transacción, borrar información, etc. Para comprender esto vamos a ver un ejemplo.

Voy a mantener el código lo más simple posible, asi que no habrá bases de datos ni nada sobre las mejores practicas, solo el código absolutamente necesario. Usaremos dos archivos de php login.php e index.php, los cuales se lista a continuación

Como ves los archivos son muy simples, el primero muestra un formulario y valida que ingreses el email [email protected] y la clave 123, si lo haces, te envía a la pagina index.php

Luego la página index.php primero valida si ya has iniciado sesión, sino te envía a la pantalla de login, luego si detecta que ya has usado el formulario, entonces actualiza tu email según el dato que ha recibido (en este caso solo muestra un mensaje diciendo que lo cambio), finalmente esta el código para mostrar el formulario.

Ahora todo se ve bien, si pruebas el código, solo puedes cambiar tu email si entras al sistema con tus datos. Pero ahora si ingresas esto en la barra de direcciones  http://localhost/index.php?email=php%40hacked.com, y verás que has sido atacado con éxito.

Ejemplo CSRF

Esto solo funciona si la victima ha iniciado sesión en el sistema y el atacante prueba con cientos de personas al azar esperando que alguna caiga en la trampa.

Como evitar ataques CSRF en tu aplicación

Algunas personas piensan que con usar el método POST en los formularios, la aplicación ya esta protegida contra este tipo de ataques, pero esto no es cierto, usando Javascript puedes hacer que una persona envíe parámetros POST a una pagina web, con solo presionar un botón o hacer clic en una imagen dentro de otro sitio.

La única forma efectiva de hacerlo es mediante tokens (valores aleatorios) generados por la aplicación y anexados al formulario que muestra la aplicación, luego si al procesar los valores del formulario, el token que se recibe corresponde al token de la aplicación, eso significa que la petición es autentica. Para implementar esta medida de seguridad, primero vamos a crear una clase, en mi caso tengo un archivo llamado csrf.php con este código:

Ahora tengo que modificar todos mis archivos en donde exista un formulario o en donde se procese información enviada por un usuario, en el ejemplo anterior el formulario quedaría de esta forma:

Como ves, se siguen 3 pasos:

  1. Incluir archivo csrf.php
  2. Validar el token usando la funcion csrf::checkTokenCSRF y pasando como referencia el token que recibimos
  3. Incluir un campo oculto y el token que generemos con la función csrf::getTokenCSRF

Ahora intenta actualizar los datos (email) usando el formulario y verás que todo funciona igual, pero si intentas ingresar por medio de la barra de direcciones ingresando la ruta completa y los parámetros, verás que de esa forma ha dejado de funcionar y ya estas protegido contra ataques de tipo CSRF.



Ir a la barra de herramientas