Les attaques CSRF (Cross-Site Request Forgery), également appelées falsifications de requêtes intersites, sont une menace courante mais souvent sous-estimée dans le monde de la sécurité des applications web. Dans ce tutoriel, nous allons examiner ce qu'est une attaque CSRF, comment elle fonctionne, et comment vous pouvez protéger votre site web contre ce type de menace.
Qu'est-ce qu'une attaque CSRF ?
Une attaque CSRF se produit lorsqu'un utilisateur authentifié d'un site web est amené, à son insu, à exécuter une action non désirée sur ce site. Par exemple, un pirate pourrait envoyer une requête à votre insu, utilisant vos informations d'authentification pour exécuter une action que vous n'avez pas autorisée, comme modifier votre mot de passe ou effectuer un transfert bancaire.
Le problème principal réside dans le fait que, lorsque vous êtes connecté à un site, vos informations d'authentification (comme un cookie de session) sont automatiquement envoyées avec toute requête HTTP effectuée vers ce site. Un pirate peut tirer parti de cette fonctionnalité pour manipuler ces requêtes en votre nom.
Illustration d'une attaque CSRF
Imaginons un formulaire HTML basique qui permet à un utilisateur de soumettre une adresse email pour l'enregistrer dans une base de données. Le code PHP associé à ce formulaire pourrait ressembler à ceci :
if (!empty($_POST)) {
$email = $_POST['email'];
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $db->prepare("INSERT INTO emails (email) VALUES (:email)");
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->execute();
} else {
echo "Email incorrect";
}
}
Ce code simple permet de valider et d'enregistrer un email dans une base de données. Toutefois, il est vulnérable aux attaques CSRF. Un pirate pourrait créer un site tiers qui envoie une requête POST à ce script, injectant ainsi des données dans la base de données sans votre consentement.
Comment se protéger des attaques CSRF ?
La méthode la plus courante pour se protéger contre les attaques CSRF est l'utilisation de tokens CSRF. Un token CSRF est un jeton unique et aléatoire qui est généré par le serveur et inclus dans les formulaires HTML. Lors de la soumission du formulaire, ce token est vérifié par le serveur pour s'assurer qu'il correspond à celui stocké dans la session de l'utilisateur. Si le token ne correspond pas, la requête est rejetée.
Implémentation d'un token CSRF
Voici comment vous pouvez implémenter un token CSRF dans votre formulaire :
Génération du token CSRF : Le token est généré lorsque le formulaire est affiché pour la première fois.
session_start();
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
Inclusion du token dans le formulaire : Le token généré est inclus dans le formulaire HTML sous la forme d'un champ caché.
<form method="POST" action="submit.php">
<input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
<input type="email" name="email">
<input type="submit" value="Envoyer">
</form>
Vérification du token lors de la soumission : Lors de la soumission du formulaire, le serveur vérifie que le token reçu correspond à celui stocké dans la session de l'utilisateur.
session_start();
if (!empty($_POST)) {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('Token CSRF invalide');
}
$email = $_POST['email'];
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $db->prepare("INSERT INTO emails (email) VALUES (:email)");
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->execute();
} else {
echo "Email incorrect";
}
}
Avec cette protection en place, un pirate ne pourra plus injecter de données dans votre base de données depuis un site tiers, car il ne pourra pas deviner le token CSRF qui est généré de manière aléatoire et unique pour chaque session utilisateur.
Conclusion
Le CSRF est une menace sérieuse pour la sécurité des applications web, mais il existe des mesures simples et efficaces pour se protéger. L'utilisation de tokens CSRF est une méthode robuste pour empêcher les pirates de manipuler les actions des utilisateurs à leur insu. En implémentant cette protection, vous ajoutez une couche de sécurité essentielle à vos formulaires web, garantissant ainsi que seules les requêtes légitimes provenant de vos utilisateurs authentifiés sont exécutées.
N'oubliez pas de tester vos applications pour vous assurer que les tokens CSRF fonctionnent correctement et qu'ils protègent effectivement vos utilisateurs contre les attaques potentielles.
Obtenir de l'aide
Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat