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
Libérer: 2024-12-17 20:00:20
original
320 Les gens l'ont consulté

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;
}
Copier après la connexion

HTML :

<input type="hidden" name="token" value="<?php echo $token; ?>" />
Copier après la connexion

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'];
Copier après la connexion

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'];
Copier après la connexion

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
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal