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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-14 20:46:13648parcourir

Why are my CSRF tokens sometimes empty when used in AJAX and standard forms, and how can I fix this in PHP?

Sécurisation des formulaires avec une implémentation appropriée du jeton CSRF en PHP

Question :


< ;p>Lorsque vous tentez d'ajouter un jeton CSRF à deux formulaires différents, l'un en utilisant AJAX et l'autre un formulaire de contact basique, on observe que la valeur du token dans le HTML est sporadiquement vide. Comment ce problème peut-il être résolu ?

Réponse :

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.

Génération de jetons CSRF forts :

Remplacez la génération de jetons par une génération sécurisée méthodes pour PHP 7 ou PHP 5.3 :

PHP 7


session_start();
if (vide($_SESSION['token'])) {

$_SESSION['token'] = bin2hex(random_bytes(32));

}
$token = $_SESSION['token'];

PHP 5.3 (ou avec ext-mcrypt)


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'];

Vérification des jetons CSRF :

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
}

}

Per -Restrictions des jetons de formulaire :

Pour restreindre davantage les jetons à des formulaires spécifiques, utilisez hash_hmac() :


echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);

?>" />

Approche hybride avec intégration Twig :

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 :



Jetons CSRF à usage unique :

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn