Maison >développement back-end >tutoriel php >Pourquoi mes jetons CSRF sont-ils parfois vides lorsqu'ils sont utilisés dans AJAX et dans des formulaires standard, et comment puis-je résoudre ce problème en PHP ?
Le problème provient probablement de la méthode de génération de jetons, car le code fourni est vulnérable à la prédiction et au manque d’entropie. Cette méthode est également insuffisante pour la validation de jetons à usage unique et par formulaire.
Remplacez la génération de jetons par une génération sécurisée méthodes pour PHP 7 ou PHP 5.3 :
session_start();
if (vide($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
session_start();
if (vide ($_SESSION['jeton'])) {
if (function_exists('mcrypt_create_iv')) { $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); }
}
$token = $_SESSION['token'];
Utilisez hash_equals() pour vérifier les jetons en toute sécurité :
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and keep an eye on these attempts }
}
Pour restreindre davantage les jetons à des formulaires spécifiques, utilisez hash_hmac() :
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
?>" />
Pour ceux qui utilisent des modèles Twig, une double stratégie simplifiée peut être implémenté :
$twigEnv->addFunction(
new \Twig_SimpleFunction( 'form_token', function($lock_to = null) { if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } if (empty($_SESSION['token2'])) { $_SESSION['token2'] = random_bytes(32); } if (empty($lock_to)) { return $_SESSION['token']; } return hash_hmac('sha256', $lock_to, $_SESSION['token2']); } )
);
Avec cette fonction, les jetons généraux sécurisés peuvent être utilisés comme :
Alors que les jetons par formulaire peuvent être générés avec :
Pour les besoins en matière de jetons à usage unique, envisagez d'utiliser une bibliothèque dédiée telle que Bibliothèque anti-CSRF de Paragon Initiative Enterprises.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!