Maison >développement back-end >tutoriel php >Comment implémenter en toute sécurité la protection des jetons CSRF dans les formulaires PHP ?

Comment implémenter en toute sécurité la protection des jetons CSRF dans les formulaires PHP ?

DDD
DDDoriginal
2024-12-17 20:00:20421parcourir

How to Securely Implement CSRF Token Protection in PHP Forms?

Gérer les techniques de défense CSRF : présentation pas à pas avec les formulaires PHP

Introduction

L'ajout de fortifications de sécurité appropriées à votre site Web implique de traiter vulnérabilités potentielles, y compris Cross-site Request Forgery (CSRF). Cet article explique comment ajouter efficacement un jeton CSRF à l'aide de PHP.

Comprendre le problème

Vous avez implémenté la protection des jetons CSRF sur votre site Web, mais la valeur du jeton est incohérente présents dans les formulaires HTML. Plus précisément, les formulaires « Contactez-nous » et AJAX présentent ce problème.

Révision du code

Examinons le code utilisé pour injecter le token :

PHP :

if (!isset($_SESSION)) {
    session_start();
    $_SESSION['formStarted'] = true;
}

if (!isset($_SESSION['token'])) {
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}

HTML :

<input type="hidden" name="token" value="<?php echo $token; ?>" />

Résoudre les faiblesses

Malheureusement, la méthode actuelle de génération de jetons utilise des techniques :

  • rand() n'est pas une source fiable d'aléatoire.
  • uniqid() produit un nombre limité d'entropie.
  • md5() ne contribue pas à l'entropie, mais la permute plutôt.

Mise en œuvre d'un jeton robuste Générateur

Pour sauvegarder vos formulaires, utilisez le code PHP suivant :

PHP 7 :

session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];

PHP 5.3 (ou avec ext-mcrypt):

session_start();
if (empty($_SESSION['token'])) {
    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 du jeton

Ensuite, validez correctement le jeton CSRF pour empêcher les tentatives d'exploitation :

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to process the form data
    } else {
         // Log this as a warning and monitor such attempts
    }
}

Supplémentaire Considérations

  • Envisagez de rendre les jetons CSRF spécifiques à chaque formulaire pour une sécurité renforcée.
  • Pour une protection supplémentaire, utilisez le moteur de création de modèles Twig pour simplifier la gestion des jetons et intégrez-le dans votre modèles.
  • Explorez l'utilisation de bibliothèques spécialisées comme la bibliothèque Anti-CSRF de Paragon Initiative Enterprises pour un CSRF unique et à usage unique. jetons.

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