XSS vs CSRF : différences, exemples et prévention

Web Security
12 min de lecture
XSS vs CSRF : différences, exemples et prévention
Sur cette page
  1. XSS vs CSRF : la différence en un coup d'oeil
  2. Qu'est-ce que le XSS (cross-site scripting) ?
    1. Un exemple d'attaque XSS
  3. Qu'est-ce que le CSRF (cross-site request forgery) ?
    1. Comment fonctionne une attaque CSRF
    2. Un exemple d'attaque CSRF
  4. Comment XSS et CSRF diffèrent en profondeur
  5. Le XSS peut-il mener au CSRF ?
  6. Comment prévenir le XSS et le CSRF
    1. Prévenir le XSS
    2. Prévenir le CSRF
  7. Impact concret
  8. Comment tester le XSS et le CSRF
    1. Pratiquez avec des labs dédiés
  9. Considérations légales et éthiques
  10. Questions fréquentes
  11. Vos prochaines étapes

Deux failles, deux intrusions très différentes. Avec le XSS (cross-site scripting), l'attaquant fait tourner son JavaScript à l'intérieur d'une page de confiance, où il peut lire tout ce que vous voyez. Avec le CSRF (cross-site request forgery), l'attaquant ne touche jamais cette page : c'est son propre site qui pousse discrètement votre navigateur à envoyer une requête que la cible accepte, du type "vire 1 000 $", et votre cookie de session fait le reste.

Toute la différence entre XSS et CSRF tient en une phrase : le XSS, c'est du code qui s'exécute dans la cible ; le CSRF, c'est une requête forgée tirée depuis l'extérieur. Les deux figurent dans l'OWASP Top 10, et le plus rapide pour sentir l'écart est d'exploiter chacune une fois : déclenchez une alert inoffensive dans le lab XSS Playground, puis forgez un virement dans le lab CSRF plus bas. Ce guide place les deux attaques côte à côte, montre pourquoi l'une peut battre les défenses de l'autre, et explique ce qui arrête vraiment chacune en 2026.

TL;DR : le XSS injecte le JavaScript de l'attaquant dans un site de confiance, ce qui lui permet de lire des données, voler des tokens et agir à la place de l'utilisateur. Le CSRF pousse un navigateur authentifié à envoyer une requête non désirée depuis un autre site ; il peut déclencher des actions mais pas lire la réponse. Contre le XSS : encodage de sortie selon le contexte et Content Security Policy. Contre le CSRF : tokens anti-CSRF, cookies SameSite et vérification Fetch Metadata. Si un site a du XSS, ses défenses CSRF ne comptent plus.

XSS vs CSRF : la différence en un coup d'oeil

Quelle est la différence entre XSS et CSRF ? Le XSS fait exécuter le script de l'attaquant par le site vulnérable, dans le navigateur de la victime, avec un accès complet à la page. Le CSRF fait envoyer par le navigateur de la victime une requête vers le site vulnérable depuis une page contrôlée par l'attaquant, en abusant du fait que les cookies partent automatiquement. Le XSS peut lire et agir ; le CSRF ne peut qu'agir.

Aspect XSS CSRF
Où s'exécute le code de l'attaquant Dans la page du site vulnérable Sur la propre page de l'attaquant
Ce qu'il exploite La confiance du navigateur envers le contenu du site La confiance du site envers le navigateur de l'utilisateur
Nécessite Une entrée utilisateur affichée sans encodage Une victime connectée et une requête sensible prévisible
Peut lire la réponse ? Oui Non (same-origin policy)
Impact typique Vol de données, prise de compte, toute action de l'utilisateur Une action forgée : virement, changement d'e-mail, de réglages
OWASP Top 10:2025 A05:2025 Injection (CWE-79) A01:2025 Broken Access Control (CWE-352)
Principales défenses Encodage de sortie, CSP, cookies HttpOnly Tokens CSRF, cookies SameSite, Fetch Metadata

Moyen mnémotechnique : le XSS met des mots dans la bouche du site. Le CSRF imite la signature de l'utilisateur.

Qu'est-ce que le XSS (cross-site scripting) ?

Le cross-site scripting se produit quand une application insère une entrée utilisateur dans une page sans l'encoder : le navigateur interprète alors cette entrée comme du HTML ou du JavaScript au lieu de l'afficher comme du texte. Le script injecté s'exécute sous l'origine du site, avec accès à la page, à son DOM, à ses cookies non-HttpOnly et à tout ce que l'utilisateur peut faire.

Il existe en trois variantes, détaillées dans notre guide du cross-site scripting :

  • XSS réfléchi : la charge voyage dans la requête (souvent un paramètre d'URL) et est renvoyée telle quelle. La victime doit ouvrir un lien piégé.
  • XSS stocké : la charge est enregistrée (un commentaire, une bio) et servie à chaque visiteur. Aucun lien à envoyer, ce qui en fait le type le plus dangereux.
  • XSS basé sur le DOM : le JavaScript du site écrit une donnée non fiable, comme location.hash, dans la page. Le serveur ne voit parfois jamais la charge.

Un exemple d'attaque XSS

Une page de recherche renvoie la requête sans l'encoder :

<!-- PHP vulnérable -->
<p>Résultats pour : <?php echo $_GET['q']; ?></p>

Envoyez q=chaussures et la page affiche "Résultats pour : chaussures". Envoyez q=<script>alert(document.domain)</script> et le navigateur interprète cela comme une vraie balise script et l'exécute. La preuve est une alerte inoffensive, mais le même point d'appui permet à un script de lire la page et d'envoyer des requêtes au nom de l'utilisateur connecté. Si le cookie de session n'est pas marqué HttpOnly, il peut aussi le lire directement, d'où l'importance de ce seul attribut.

💻
Pratiquez maintenant : lab XSS Playground - injectez une charge dans un champ non encodé, voyez-la s'exécuter et apprenez quel contexte demande quelle évasion. Dans le navigateur, sans installation.

Qu'est-ce que le CSRF (cross-site request forgery) ?

Le cross-site request forgery pousse le navigateur d'un utilisateur connecté à envoyer une requête sensible vers un site qui lui fait confiance. La page de l'attaquant construit la requête, le navigateur y attache les cookies de la victime, et le serveur voit une session valide et exécute l'ordre. Rien n'est injecté dans le site vulnérable.

Comment fonctionne une attaque CSRF

  1. La victime se connecte à bank.example. Un cookie de session est stocké dans son navigateur.
  2. Elle ouvre la page de l'attaquant dans un autre onglet, toujours connectée.
  3. Cette page tire une requête vers bank.example, cachée dans une balise image ou un formulaire auto-soumis.
  4. Le navigateur y attache automatiquement le cookie de session, car c'est ainsi que fonctionnent les cookies pour toute requête vers ce domaine.
  5. Le serveur la traite comme légitime, incapable de distinguer une requête forgée d'une vraie.

Un exemple d'attaque CSRF

Pour un endpoint qui accepte un GET, une balise image cachée sur la page de l'attaquant suffit :

<!-- Sur la page de l'attaquant -->
<img src="https://bank.example/transfer?to=mallory&amount=1000" style="display:none">

Pour un endpoint POST, un formulaire auto-soumis fait le même travail :

<form action="https://bank.example/transfer" method="POST" id="f">
  <input type="hidden" name="to" value="mallory">
  <input type="hidden" name="amount" value="1000">
</form>
<script>document.getElementById('f').submit();</script>

L'attaque est invisible. La victime charge une page et le virement a lieu, sans confirmation ni rien d'anormal à l'écran. Cela ne marche que tant qu'elle a une session active et si l'endpoint n'a aucune protection anti-CSRF.

Comment XSS et CSRF diffèrent en profondeur

Ce qui est exploité

XSS : la confiance du navigateur envers le contenu du site. Le script injecté tourne avec tous les privilèges du site.

CSRF : la confiance du serveur envers les cookies du navigateur. Toute requête à session valide est acceptée.

Ce que l'attaquant obtient

XSS : lecture et écriture. Voler des données, lire des tokens, réécrire la page, exécuter n'importe quelle action.

CSRF : écriture seule. Déclencher une action, mais jamais lire la réponse.

Où tourne le code

XSS : dans le site vulnérable lui-même.

CSRF : sur la page de l'attaquant, visant le site vulnérable.

Dépendance à la session

XSS : marche connecté ou non (une session vive le rend plus précieux).

CSRF : ne marche que contre une session authentifiée vive.

Le XSS peut-il mener au CSRF ?

Oui, et c'est pour cela que le XSS est plus grave que le CSRF. Un token CSRF fonctionne parce que la page externe de l'attaquant ne peut pas le lire. Mais le XSS s'exécute dans l'origine : le script injecté peut donc lire le token directement dans la page et l'attacher à une requête forgée. La requête paraît alors parfaitement légitime, token compris.

Autrement dit, un point d'appui XSS traverse les défenses CSRF sans effort. La conclusion pratique : si un site a du XSS, vous avez le CSRF gratuitement, plus la lecture des données. Corriger le CSRF ne fait rien contre le XSS, et un XSS non corrigé sape vos protections CSRF.

Comment prévenir le XSS et le CSRF

Les deux demandent des défenses différentes. Les tokens CSRF ne font rien contre le XSS, et l'encodage de sortie ne fait rien contre le CSRF. Il faut les deux jeux en place.

Prévenir le XSS

  • 🔒 Encodage de sortie selon le contexte. Échappez la donnée utilisateur pour le contexte exact où elle atterrit (corps HTML, attribut, JavaScript, URL). C'est le correctif qui met fin à la faille. Laissez le framework échapper par défaut et auditez chaque échappatoire comme dangerouslySetInnerHTML ou un innerHTML brut.
  • 🛡️ Content Security Policy. Une CSP stricte qui bloque les scripts inline est une solide seconde couche. Elle ne corrige pas la faille, mais elle peut empêcher une charge de s'exécuter quand une passe entre les mailles.
  • 🍪 Cookies de session HttpOnly. Empêchent le JavaScript de lire le cookie de session, neutralisant la forme la plus directe de vol de session. À associer à Secure.
  • ✅ Assainissez le HTML riche avec une bibliothèque éprouvée. Si les utilisateurs soumettent légitimement du HTML, passez-le par DOMPurify plutôt qu'un filtre maison.

Prévenir le CSRF

  • 🎫 Tokens anti-CSRF. Placez un token imprévisible par session dans chaque formulaire sensible et vérifiez-le côté serveur. Une page externe ne peut ni le lire ni le deviner.
  • 🍪 Cookies SameSite. SameSite=Lax (défaut de Chrome depuis 2020) empêche les cookies de partir sur la plupart des requêtes cross-site ; Strict est plus serré. À traiter comme défense en profondeur, pas comme seul contrôle, car c'est un comportement du navigateur, pas une vérification serveur.
  • 🔍 Vérifications Fetch Metadata et Origin. Rejetez les requêtes sensibles dont l'en-tête Sec-Fetch-Site ou Origin montre qu'elles viennent d'un autre site.
  • 🔐 Ré-authentification pour les actions critiques. Exigez un mot de passe ou une étape de confirmation pour les opérations sensibles comme les virements.

Aide-mémoire en une ligne : défense XSS = encoder la sortie + CSP + HttpOnly. Défense CSRF = tokens + SameSite + vérification d'Origin.

Impact concret

Le XSS en conditions réelles

Ver Samy (MySpace, 2005) : un ver XSS stocké qui ajoutait son auteur en ami et se recopiait sur le profil de chaque visiteur, touchant plus d'un million de comptes en moins d'un jour.

Fortnite (2019) : Check Point a chaîné une faille XSS sur un vieux sous-domaine d'Epic Games avec un défaut de redirection OAuth pour voler des tokens de connexion et prendre des comptes sans mot de passe.

Le CSRF en conditions réelles

ING Direct (2008) : les chercheurs Zeller et Felten ont montré une faille CSRF capable de sortir de l'argent du compte d'une victime, l'une des premières attaques CSRF publiées contre une banque.

YouTube (2008) : la même recherche a trouvé du CSRF dans presque toutes les actions utilisateur du site, de l'ajout de vidéos à la messagerie.

Les deux attaques reviennent sans cesse parce que la confiance qu'elles abusent, un navigateur qui fait confiance au contenu et un serveur qui fait confiance à un cookie, est inscrite dans le fonctionnement du web. Voyez le classement actuel dans l'OWASP Top 10:2025.

Comment tester le XSS et le CSRF

Checklist de test XSS

  • Injectez un marqueur unique dans chaque entrée, puis lisez le HTML brut pour voir s'il revient encodé ou tel quel.
  • Là où il est brut, façonnez une charge pour ce contexte (corps, attribut, script, URL).
  • Testez les paramètres d'URL, champs de formulaire, en-têtes, et tout ce qu'une SPA lit dans le fragment d'URL.
  • Prouvez l'impact avec alert(document.domain), qui montre l'origine d'exécution.

Checklist de test CSRF

  • Vérifiez si chaque requête sensible porte un token anti-CSRF.
  • Retirez ou modifiez le token et voyez si le serveur accepte encore la requête.
  • Rejouez la requête depuis une autre origine sans le token.
  • Inspectez l'attribut SameSite du cookie.

Pratiquez avec des labs dédiés

XSS Playground

Pratiquez le XSS réfléchi, stocké et basé sur le DOM dans une cible sûre, puis voyez l'encodage de sortie stopper chacun.

CSRF Bank Transfer

Forgez un virement contre une session connectée, puis ajoutez un token et voyez l'attaque cesser de marcher.

Considérations légales et éthiques

Rappel essentiel : obtenez une autorisation écrite explicite avant de tester tout site pour du XSS ou du CSRF. Envoyer des charges ou des requêtes forgées vers des systèmes qui ne vous appartiennent pas constitue un accès non autorisé au regard du Computer Fraud and Abuse Act (États-Unis), du Computer Misuse Act (Royaume-Uni) et des lois équivalentes dans le monde, même quand la charge est une simple alert.

  • Ne testez que sur des systèmes qui vous appartiennent, des cibles d'entraînement volontairement vulnérables, ou le périmètre autorisé d'un bug bounty ou d'une mission.
  • Utilisez des preuves inoffensives. Ne déployez pas de charges lisant les données de vrais utilisateurs pour démontrer l'impact.
  • Si vous trouvez une faille dans l'application d'autrui, signalez-la via son processus de divulgation et arrêtez-vous là.
  • Les labs et cours liés ici existent pour pratiquer légalement l'attaque comme la défense.

Questions fréquentes

Le CSRF est-il un type de XSS ?

Non. Ce sont des vulnérabilités distinctes, avec des mécanismes et des correctifs différents. Le XSS exécute le code de l'attaquant dans le site cible ; le CSRF envoie une requête forgée vers la cible depuis ailleurs. Leur seul lien : le XSS peut servir à battre les protections CSRF.

Lequel est le plus dangereux, XSS ou CSRF ?

Le XSS. Il donne un accès complet en lecture et écriture dans la session de l'utilisateur, pas seulement une action, et il peut lire les tokens CSRF pour contourner ces défenses. Le CSRF se limite aux actions que la victime est déjà autorisée à faire.

Le CSRF peut-il voler des données ?

Pas directement. À cause de la same-origin policy, la page de l'attaquant ne peut pas lire la réponse à une requête cross-site. Le CSRF peut faire virer de l'argent à une banque mais pas lire le solde. Le XSS, lui, tournant dans l'origine, peut lire la réponse.

Les tokens CSRF empêchent-ils le XSS ?

Non. Les tokens CSRF n'arrêtent que le CSRF. Le XSS demande ses propres défenses : encodage de sortie selon le contexte, Content Security Policy, cookies HttpOnly et échappement automatique du framework. Pire, le XSS peut lire un token CSRF dans la page et l'utiliser.

Où se situent XSS et CSRF dans l'OWASP Top 10:2025 ?

Le XSS relève d'A05:2025 Injection (CWE-79), la même catégorie que l'injection SQL. Le CSRF correspond à A01:2025 Broken Access Control (CWE-352). Les deux restent des découvertes courantes dans les applications web modernes.

Vos prochaines étapes

La distinction XSS vs CSRF revient à une seule question : le code de l'attaquant tourne-t-il à l'intérieur de la cible, ou une requête forgée est-elle tirée depuis l'extérieur ? Le XSS est le coup de l'intérieur, avec accès en lecture et écriture et le pouvoir de battre les tokens CSRF. Le CSRF est le coup de l'extérieur, limité aux actions que la victime peut déjà faire. Défendez le XSS par l'encodage de sortie et une CSP ; défendez le CSRF par des tokens, des cookies SameSite et des vérifications d'Origin ; et rappelez-vous que corriger l'un ne fait rien pour l'autre.

La lecture ne vous mène qu'à un point. Déclenchez un script dans le XSS Playground, puis forgez un virement dans le lab CSRF Bank Transfer. Pour les replacer dans toute la surface d'attaque web, le chapitre CSRF de notre cours Web Attacks les parcourt aux côtés de l'injection SQL et du reste de l'OWASP Top 10, dans des labs guidés en navigateur. Commencez avec l'offre gratuite de HackerDNA, sans carte bancaire.

HackerDNA Team

Équipe HackerDNA

Écrit par l'équipe HackerDNA - des professionnels de la cybersécurité qui créent des labs de hacking pratiques et du contenu éducatif pour vous aider à développer des compétences réelles en sécurité.

Rencontrer l'équipe

Prêt à mettre cela en pratique?

Arrêtez de lire, commencez à hacker. De vraies machines, dans votre navigateur, gratuitement.

Commencer à Hacker Gratuitement
30 000+ Hackers Vrais labs Gratuit
Commencer Gratuitement ou résolvez le hack du jour, sans compte