PHP
El Cross Site Request Forgery también llamado CSRF se basan en explotar la confianza que los sitios web tienen con sus usuarios. No como en los ataques Cross Site Scripting.
Este tipo de ataque consiste en que estando autenticado en una web alguien nos puede mandar un enlace de ese mismo sitio y aprovechando que hay una sesión iniciada modificar datos del usuario.
Para asegurarse que una acción está realmente siendo llevada a cabo por el usuario en lugar de un tercero, hay que asociarlo con algún tipo de identificador único que puede ser verificado después, llamado token que se guardaría en sesión y en cada operación importante, hay que recibir dicho token y comprobarlo con el token que se ha guardado en sesión. Lo más seguro es envir dicho token en un hidden y generar un token en cada inicio de sesión.
Las mejores formas de generar un token son:
- $_SESSION['token'] = md5(uniqid(rand(), true));
- $_SESSION['token'] = base64_encode( openssl_random_pseudo_bytes(32));
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = base64_encode( openssl_random_pseudo_bytes(32));
}
$token = $_SESSION['csrf_token'];
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!empty($_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// El token es válido, procesa el formulario
return true;
} else {
// Token no válido, maneja el error o redirige
die("Error CSRF: Token no válido");
}
}