Pour empêcher CSRF, vous devez valider un jeton unique POST et associé à la session en cours. Quelque chose comme le suivant. . .
Sur la page où les demandes des utilisateurs pour supprimer un enregistrement:
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>
Puis, quand il s'agit de supprimer réellement l'enregistrement:
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.
}
?>
Le jeton devrait être difficile à deviner, unique pour chaque demande de suppression, accepté via $ _POST seulement et expirant après quelques minutes (expiration non montrée dans cet exemple).
L'expiration de la session ne devrait pas être suffisante? Je ne veux pas vérifier l'expiration avec une fonction personnalisée. –
Les sessions n'empêchent pas CSRF @JavierConstanzo. Parfois, ils durent des semaines ou plus.Que se passe-t-il si vous ouvrez un site Web avec une attaque CSRF alors que votre session est toujours active? –
Pourquoi voudriez-vous configurer votre serveur @EdsonMedina pour avoir des sessions qui durent des semaines? Je sais que les séances ne suffisent pas à prévenir la CSRF, ce que je n'impliquais pas. –