CSRF: Si eres desarrollador web debes conocer cómo implementar esta protección, es probable que hayas oído hablar de los ataques CSRF (Cross-Site Request Forgery). Este tipo de ataque se produce cuando un usuario malintencionado aprovecha la sesión activa de un usuario legítimo para realizar acciones no autorizadas en su nombre.
Por ejemplo, el atacante podría utilizar el navegador web del usuario legítimo para enviar un formulario o hacer clic en un enlace que realice una acción malintencionada, como transferir dinero o borrar datos importantes.
Explicó el ejemplo.
Imagina que uno de tus usuarios inicia sesión en uno de tus sitios web o sistema de información web y realiza con éxito todas las actividades que tiene que hacer en él. En seguida, este usuario se dispone a navegar por internet sin salir correctamente de tu plataforma, sin cerrar o terminar la sesión que inició.
Ahora, el usuario entra a un sitio web que le interesó. Supongamos que por descuido, como usualmente pasa, entró a un sitio web desarrollado por un hacker. En cuanto el usuario da clic a un enlace o botón, este sitio web malicioso realiza una solicitud HTTP a tu portal, donde el usuario aún tiene su sesión activa y realiza una acción de borrado de datos.
Para que todo esto se llevará a cabo, el atacante solo necesitó conocer la solicitud HTTP correcta y las cookies correspondientes para hacer el daño necesario a nombre del usuario.
El ataque CSRF funciona porque el navegador web del usuario legítimo incluye automáticamente las cookies de autenticación en todas las solicitudes enviadas al sitio web, incluso si el usuario no ha iniciado sesión de forma explícita. Esto significa que si un atacante puede hacer que el navegador del usuario legítimo envíe una solicitud a un sitio web malintencionado, esa solicitud contendrá las cookies de autenticación y se autenticará automáticamente como si fuera el usuario legítimo.
A groso modo así funciona.
Para proteger tu sitio web contra este tipo de ataques, debes asegurarte de que todas las acciones que modifican datos estén protegidas. Esto incluye enviar formularios, hacer clic en enlaces y realizar cualquier otra acción que modifique los datos de tu sitio web. Una forma común de protegerse es mediante el uso de tokens CSRF únicos y aleatorios.
¿Qué es un token CSRF?
Un token CSRF es un identificador único y aleatorio que se utiliza para asegurarse de que una solicitud proviene de un usuario legítimo y de tu sitio web, y no de otro sitio web (atacante).
Cada vez que un usuario realiza una acción que modifica los datos, se genera un nuevo token CSRF y se lo asocia con la sesión del usuario. Luego, cuando se envía la solicitud, se incluye el token como un parámetro en la solicitud. Cuando el servidor recibe la solicitud, valida que el token enviado por el usuario sea el mismo que el generado por el servidor para esa sesión.
¿Cómo se implementa la protección CSRF en PHP?
Implementar la protección en PHP es bastante sencillo. A continuación, se muestra una manera de cómo poder hacerlo:
Genera un token CSRF único y aleatorio para cada acción que modifica los datos
Para generar un token CSRF único y aleatorio, puedes utilizar la función random_bytes()
de PHP. Esta función genera una cadena de bytes aleatorios que puedes convertir en una cadena hexadecimal utilizando la función bin2hex()
.
Por ejemplo:
$token = bin2hex(random_bytes(32));
En este ejemplo, se genera un token CSRF de 32 bytes y lo convierte en una cadena hexadecimal.
Asocia el token CSRF con la sesión del usuario
Una vez que tengas el token CSRF, debes asociarlo con la sesión del usuario para que puedas validar el token cuando se envíe la solicitud. Puedes hacer esto almacenando el token en una variable de sesión.
Por ejemplo:
$_SESSION['csrf_token'] = $token;
En este ejemplo, se almacena el token CSRF en la variable de sesión $_SESSION['csrf_token']
.
Incluye el token CSRF en cada formulario y enlace que modifique los datos
Una vez que tengas el token CSRF asociado con la sesión del usuario, debes incluirlo en cada formulario y enlace que modifique los datos. Puedes hacer esto añadiendo un campo oculto al formulario o incluyendo el token como un parámetro en el enlace.
Por ejemplo:
<form method="post" action="/procesar-formulario.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<!-- Resto de campos del formulario -->
<button type="submit">Enviar</button>
</form>
<a href="/eliminar-datos.php?csrf_token=<?php echo $_SESSION['csrf_token']; ?>">Eliminar datos<\a>
En estos ejemplos, se incluye el token CSRF en el formulario como un campo oculto llamado “csrf_token” y en el enlace como un parámetro llamado “csrf_token”.
Valida el token CSRF cuando se procesa la solicitud
Una vez que el usuario envía la solicitud, debes validar el token CSRF para asegurarte de que la solicitud proviene de un usuario legítimo. Puedes hacer esto comparando el token enviado por el usuario con el token almacenado en la variable de sesión. Si los tokens coinciden, la solicitud es válida. Si no coinciden, la solicitud es probablemente un ataque CSRF y debe ser rechazada.
Por ejemplo:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('Token CSRF inválido');
}
// Procesar la solicitud
}
En este ejemplo, se compara el token CSRF enviado por el usuario con el token almacenado en la variable de sesión $_SESSION['csrf_token']
. Si los tokens no coinciden, se muestra un mensaje de error y se detiene la ejecución del script. Si los tokens coinciden, se procesa la solicitud.
En PHP, puedes implementar la protección CSRF utilizando la función random_bytes()
para generar tokens únicos y la variable de sesión $_SESSION
para almacenarlos y validarlos.
Al seguir estas recomendaciones, podrás proteger tu sitio web contra los ataques CSRF y garantizar la seguridad de tus usuarios y sus datos.