Les attaques Cross-Site Request Forgery (CSRF), aussi appelées attaques par contrefaçon de requête intersite, sont l'une des vulnérabilités web les plus anciennes et persistantes. Elles visent les actions modifiant l'état du serveur (comme les transferts d'argent ou changements de mot de passe) qui nécessitent une authentification. Un attaquant force ainsi un utilisateur authentifié à exécuter une requête malveillante à son insu.
Des pratiques de sécurité insuffisantes, comme l'absence de validation des requêtes, facilitent ces attaques. Découvrez ce qu'est une attaque CSRF et comment la prévenir, que vous soyez développeur ou utilisateur.
Une attaque CSRF exploite les sessions actives pour effectuer des actions non autorisées. Elle utilise les identifiants de session, cookies ou failles serveur pour usurper l'identité de l'utilisateur.
Les protections anti-CSRF bloquent les interactions cross-domain malveillantes. Sans elles, un attaquant peut injecter un script via une balise malveillante, exploiter la session utilisateur et rediriger vers un site piégé, souvent via ingénierie sociale (e-mails phishing).
Conséquences : vol de fonds, modification de comptes, perte d'accès. Des cas réels incluent des détournements bancaires ou changements de mots de passe.
Les cibles principales sont les actions authentifiées nécessitant une interaction involontaire : requêtes GET, POST, PUT, DELETE.
Les attaquants combinent souvent CSRF avec session hijacking pour modifier l'IP et rediriger vers un faux formulaire.
Sur un site e-commerce vulnérable utilisant GET pour les paiements :
https://example.com/pay?amount=10&account=ABC Un attaquant modifie : https://example.com/pay?amount=20000&account=ATTACKER Un clic innocent transfère les fonds.Évitez les GET pour les actions modifiant l'état.
Les POST ne sont pas immunes. Un formulaire légitime :
<form action="https://example.com/pay" method="POST">
<input type="text" name="account">
<input type="number" name="amount">
<input type="submit" value="Payer">
</form> L'attaquant crée : <body onload="document.getElementById('form').submit()">
<form action="https://example.com/pay" id="form" method="POST">
<input type="hidden" name="account" value="ATTACKER">
<input type="hidden" name="amount" value="30000">
</form>
</body> Soumission automatique au chargement.Similaire pour PUT (changement mot de passe) : redirection vers lien de reset e-mail vers l'attaquant.

Utilisez des jetons CSRF (tokens synchronisés) uniques et changeants par session, au lieu de cookies seuls. Frameworks comme Laravel, Django ou Spring les intègrent nativement.
Implémentez 2FA pour les actions sensibles. Échappez le HTML des inputs pour bloquer XSS combiné. Suivez OWASP guidelines.
Choisissez des sites fiables, utilisez navigateurs sécurisés (HTTPS Everywhere), activez 2FA. Évitez de rester connecté, méfiez-vous des liens suspects.
Ne stockez pas de mots de passe dans le navigateur.
Testez régulièrement vos apps (pentests, outils comme Burp Suite). Équilibrez les protections sans introduire nouvelles vulnérabilités.
[]