Blog de Gonzalo

Blog de programación de Gonzalo López

CROSS SITE REQUEST FORGERY
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));
Voy a poner un ejemplo: En el archivo de login o en cualquier php hacemos lo siguiente:

session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] =  base64_encode( openssl_random_pseudo_bytes(32));
}
$token = $_SESSION['csrf_token'];
En cualquier formulario de la página será necesario crear un campo hidden para guardar el token csrf. Y en el php que gestiona cada formulario poner lo siguiente:

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");
    }
}
Espero que éste post ayude a tener sitios más seguros.

Compartir en twitter