Definition
CSRF (Cross-Site Request Forgery), aussi appele "session riding", est une attaque web qui force un utilisateur authentifie a executer des actions non souhaitees sur un site ou il est connecte.
L'attaquant exploite le fait que le navigateur envoie automatiquement les cookies de session avec chaque requete vers un domaine donne.
Comment fonctionne l'attaque ?
- Alice est connectee a sa banque (banque.com) — son cookie de session est actif
- Alice visite un site malveillant qui contient :
<!-- Sur le site malveillant -->
<img src="https://banque.com/virement?montant=10000&destinataire=attaquant" />
- Le navigateur d'Alice envoie la requete a banque.com avec son cookie de session
- La banque execute le virement car la requete semble legitime
Methodes de prevention
1. Token CSRF (Synchronizer Token Pattern)
Le serveur genere un token unique par session, inclus dans chaque formulaire :
<form method="POST" action="/virement">
<input type="hidden" name="_csrf" value="abc123xyz789" />
<input type="number" name="montant" />
<button type="submit">Envoyer</button>
</form>
Le serveur verifie que le token dans la requete correspond a celui de la session.
2. SameSite Cookies (le plus simple)
Set-Cookie: session=abc123; SameSite=Strict; Secure; HttpOnly
- Strict : le cookie n'est jamais envoye sur les requetes cross-site
- Lax : envoye uniquement sur les navigations top-level (liens, pas formulaires)
- None : envoye partout (requiert Secure)
3. Verification des headers Origin/Referer
app.use((req, res, next) => {
const origin = req.headers.origin || req.headers.referer;
if (origin && !origin.startsWith('https://monsite.com')) {
return res.status(403).json({ error: 'CSRF detected' });
}
next();
});
4. Double Submit Cookie
Envoyer le token CSRF a la fois dans un cookie et dans un header/body. Le serveur verifie qu'ils correspondent.
CSRF et les API REST
Les API stateless utilisant des JWT dans le header Authorization (pas de cookies) ne sont pas vulnerables au CSRF, car le token n'est pas envoye automatiquement par le navigateur.
Frameworks et protection CSRF
La plupart des frameworks web integrent une protection CSRF :
- Laravel :
@csrfdans les formulaires Blade - Django :
{% csrf_token %}middleware - Express :
csurfmiddleware - Next.js : SameSite cookies par defaut