Para evitar CSRF, querrá validar un token de un solo uso, POST'ed y asociado con la sesión actual. Algo como lo siguiente. . .
En la página en las solicitudes de los usuarios para eliminar un registro:
confirm.php
<?php
session_start();
$token= md5(uniqid());
$_SESSION['delete_customer_token']= $token;
session_write_close();
?>
<html>
<body>
<form method="post" action="confirm_save.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>
Luego, cuando llegue el momento de eliminar el registro:
confirm_save.php
<?php
session_start();
$token = $_SESSION['delete_customer_token'];
unset($_SESSION['delete_customer_token']);
session_write_close();
if ($token && $_POST['token']==$token) {
// delete the record
} else {
// log potential CSRF attack.
}
?>
El token debe ser difícil de adivinar, único para cada solicitud de eliminación, aceptado solo a través de $ _POST y caducado después de unos minutos (el vencimiento no se muestra en este ejemplo).
¿La expiración de la sesión no debería ser suficiente? Me refiero a no verificar la caducidad con una función personalizada. –
Las sesiones no impiden CSRF @JavierConstanzo. A veces duran semanas o más.¿Qué sucede si abre un sitio web con un ataque CSRF mientras su sesión todavía está activa? –
¿Por qué debería configurar su servidor @EdsonMedina para tener sesiones que duran semanas? Sé que las sesiones no son suficientes para prevenir CSRF, no estaba implicando eso. –