Parmi la protection de la sécurité des applications Web, le contrefaçon de demande inter-sites (CSRF) est l'une des méthodes d'attaque les plus courantes et les plus affectées. Bien que les cadres modernes intègrent généralement les mécanismes de protection du CSRF, les politiques de protection doivent être implémentées manuellement pour les systèmes développés à l'aide de PHP natif. Cet article explorera comment améliorer la cohérence et la sécurité des sessions dans la défense CSRF à l'aide de la fonction Session_register_Shutdown () dans PHP.
Les attaques de contrefaçon de demande CSRF (demande inter-site) sont lorsqu'un attaquant induit un utilisateur qui s'est connecté à un site Web de confiance pour envoyer des demandes involontaires au site Web sans le savoir. Cela peut entraîner des problèmes de sécurité tels que les données utilisateur falsifiées et les opérations sensibles déclenchées.
Les méthodes de défense courantes comprennent:
Utilisez le jeton CSRF et vérifiez
Vérifiez l'en-tête du référence ou de l'origine
Restreindre les méthodes de demande (comme le poste forcé)
Définir l'attribut Cookie Samesite
Cependant, un point important de la défense du CSRF est souvent négligé: le contrôle de cohérence de l'état de session. À l'heure actuelle, la fonction session_register_shutdown () peut jouer un rôle unique.
Session_register_shutdown () est une fonction introduite dans PHP 5.4 pour fermer automatiquement la session lorsque l'exécution du script se termine. Ceci est similaire à la session traditionnelle_write_close () , mais est plus sûr et plus fiable. Il garantit que les données de session sont automatiquement écrites et fermées à la fin du cycle de vie du script, évitant les problèmes que les données de session ne sont pas enregistrées ou écrasées dans des situations exceptionnelles.
Le danger des attaques CSRF est largement dû à la capacité d'un attaquant à effectuer des opérations sensibles en utilisant les sessions existantes de l'utilisateur. Si les données de session sont corrompues par des scripts malveillants ou plusieurs demandes simultanées, le mécanisme de défense peut être contourné.
L'utilisation de session_register_shutdown () peut aider à s'assurer:
Atomicité de session : empêchez la course de données de session causée par l'exécution simultanée de plusieurs demandes.
Empêcher les jetons CSRF de perdre : assurez-vous l'écriture de session avant la terminaison du script et les sauts logiques (tels que la redirection d'en-tête), assurant ainsi la fiabilité des jetons CSRF.
Améliorez la stabilité de la rotation des jetons : assurez-vous que les données de session ne seront pas corrompues pendant le processus de mise à jour des jetons et améliorez la capacité de contrôle de la rapidité du jeton.
Supposons que vous utilisiez le mécanisme de jeton CSRF sur une page de soumission de formulaire, combinée avec session_register_shutdown () pour le renforcement:
<?php
session_start();
session_register_shutdown();
// Initialiser ou vérifier CSRF Token
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
die('CSRF Échec de la vérification');
}
// Traiter les données du formulaire
// ...
}
// Générer une forme
?>
<form method="POST" action="https://m66.net/form-handler.php">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
<input type="text" name="data">
<input type="submit" value="soumettre">
</form>
Dans cet exemple, même si l'exit () , die () ou http saut instruction apparaît au milieu du code, la session peut toujours être enregistrée correctement à la fin du script car session_register_shutdown () est enregistrée. De cette façon, l'efficacité du jeton CSRF dans le traitement logique est garantie.
Bien que session_register_shutdown () ne soit pas une fonction conçue pour la défense du CSRF, dans la pratique de programmation sécurisée, il fournit un moyen d'écrire des données de session de manière stable, améliorant ainsi indirectement la fiabilité du mécanisme de jeton CSRF. En particulier dans les applications Web, où des interactions complexes telles que les redirectes multiples, les abandons des exceptions et les demandes simultanées ne peuvent pas être ignorées.
De cette façon, nous obtenons non seulement un contrôle de session plus sûr, mais fournissons également un soutien solide pour les capacités de défense CSRF de l'application globale. L'utilisation du mécanisme natif PHP pour obtenir une protection de la sécurité est une étape importante pour améliorer la sécurité des applications.