//session_start() nous permet de sauvegarder $_SESSION['csrf_token'] jusqu'au prochain rechargement de la page
session_start();
//notre fonction qui générera un token pour la page en cours
function csrf_token(){
//on "global" $csrf_token, on pourra appeler autant de fois qu'on le souhaite csrf_token() et garder le même token (sans en générer un nouveau à chaque appel de la fonction, pour la page actuelle)
global $csrf_token;
//nombre de caractères hexadécimaux du jeton de sécurité
$csrf_token_length = 50;
if(!isset($csrf_token)){
//ceil() permet d'avoir une division du nombre de caractère à l'entier supérieur (substr() permet de couper l'entier supérieur)
//random_bytes() génère des octets aléatoires cryptographiquement sécurisés
//bin2hex() convertit les octets aléatoires en représentation hexadécimale
$csrf_token = substr(bin2hex(random_bytes(ceil($csrf_token_length / 2))), 0, $csrf_token_length);
//enregistre le token pour cette session
$_SESSION['csrf_token'] = $csrf_token;
}
return $csrf_token;
}
if(isset($_GET['id'])){
echo '<h1>Méthode GET</h1>';
//vérifie si le token existe et s'il est bon
if(!isset($_GET['csrf_token']) || ($_GET['csrf_token'] !== ($_SESSION['csrf_token'] ?? ''))){
echo '<p style="color:red">TOKEN INCORRECT</p>';
}else{
echo '<p style="color:green">TOKEN CORRECT</p>';
}
}
if(isset($_POST['id'])){
echo '<h1>Méthode POST</h1>';
//vérifie si le token existe et s'il est bon
if(!isset($_POST['csrf_token'])
|| !isset($_SESSION['csrf_token'])
|| $_POST['csrf_token'] !== $_SESSION['csrf_token']){
echo '<p style="color:red">TOKEN INCORRECT</p>';
}else{
echo '<p style="color:green">TOKEN CORRECT</p>';
}
}
?>
<p><a href="?id=1">Sans CSRF (GET)</a></p>
<p><a href="?id=1&csrf_token=<?= csrf_token() ?>">Avec CSRF (GET)</a></p>
<p><a href="?id=1&csrf_token=123">Avec faux CSRF (GET)</a></p>
<p><a href="?id=1&csrf_token=">Avec CSRF vide (GET)</a></p>
<form method="post" action="csrf_test.php">
<input type="hidden" name="id" value="1">
<input type="submit" value="Sans CSRF (POST)">
</form>
<form method="post" action="csrf_test.php">
<input type="hidden" name="id" value="1">
<input type="hidden" name="csrf_token" value="<?= csrf_token() ?>">
<input type="submit" value="Avec CSRF (POST)">
</form>
<form method="post" action="csrf_test.php">
<input type="hidden" name="id" value="1">
<input type="hidden" name="csrf_token" value="1234">
<input type="submit" value="Avec faux CSRF (POST)">
</form>
<form method="post" action="csrf_test.php">
<input type="hidden" name="id" value="1">
<input type="hidden" name="csrf_token" value="">
<input type="submit" value="Avec CSRF vide (POST)">
</form>
<?php
//nombre de caractères hexadécimaux du jeton de sécurité (paramètre disponible dans la fonction PHP)L'utilisation de jetons CSRF est une pratique essentielle et courante pour renforcer la sécurité de nos applications web, vous réduisez considérablement les risques d'attaques CSRF et protégez les données sensibles de votre base de données en implémentant cette protection simple dans votre application PHP.
$csrf_token_length = 50;
J'espère que ce script gratuit vous est utile.Pour soutenir mon travail, un simple don ou mettre une note est grandement apprécié.
Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.
Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.
Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :
Demander un devis