Skip to main content
Blog
Blog security

Qu'est-ce que le DOM-based XSS ? Comment fonctionne le cross-site scripting dans le DOM

Le DOM-based XSS est une attaque de cross-site scripting où la vulnérabilité réside entièrement dans le JavaScript client-side : le propre code de la page lit une entrée contrôlée par l'attaquant et l'écrit dans le DOM de manière non sécurisée. Ce guide explique en quoi il diffère du XSS réfléchi et stocké, les sources et sinks courants, et comment le détecter.

Aug 18, 2026 3 min read
Qu'est-ce que le DOM-based XSS ? Comment fonctionne le cross-site scripting dans le DOM
Table des matières

Le DOM-based XSS est une vulnérabilité de cross-site scripting qui réside entièrement dans le code client-side. Le propre JavaScript de la page lit une entrée contrôlable par l'attaquant — le plus souvent depuis l'URL — et l'écrit dans le DOM via un sink non sécurisé comme innerHTML, exécutant ainsi le script de l'attaquant. Contrairement au XSS réfléchi ou stocké, le payload malveillant peut n'apparaître dans aucune réponse du serveur.

Comment fonctionne une attaque DOM XSS ?

La vulnérabilité est un flux de données depuis une source contrôlée par l'attaquant vers un sink qui interprète le texte comme du code ou du balisage :

// vulnerable: fragment flows straight into a sink
const name = decodeURIComponent(location.hash.slice(1));
document.querySelector("#welcome").innerHTML = "Hello " + name;
// https://example.com/#<img src=x onerror=stealCookies()>

Sources courantes : location.hash, location.search, document.referrer, window.name, les données de postMessage et le stockage client-side. Sinks courants : innerHTML/outerHTML, document.write, eval et Function, le .html() de jQuery, et les écritures d'attributs qui créent des gestionnaires ou des URLs (onclick, href avec javascript:).

Comme le fragment de l'URL n'est jamais envoyé au serveur, un payload placé après # peut exploiter la page pendant que le serveur voit une requête parfaitement normale.

XSS réfléchi vs stocké vs DOM-based

XSS réfléchiXSS stockéDOM-based XSS
Où vit le payloadDans la requête, renvoyé par le serveurDans la base de données du serveurDans l'entrée client-side (souvent le fragment de l'URL)
La réponse du serveur contient-elle le payload ?Souvent ✗
Visible pour les WAF / logs serveur ?GénéralementGénéralementSouvent non
Corrigé oùEncodage de sortie côté serveurAssainissement + encodage côté serveurCode client-side : sinks sûrs, assainissement

Pourquoi le DOM XSS est facile à manquer

Les défenses côté serveur inspectent les requêtes et les réponses ; le DOM XSS peut contourner les deux. Les frameworks réduisent le risque — React et consorts échappent par défaut — mais dangerouslySetInnerHTML, le mauvais usage des templates et les scripts tiers présents sur la page le réintroduisent. Et une page moderne exécute des dizaines de scripts que vous n'avez pas écrits : un sink non sécurisé dans n'importe lequel d'entre eux est un sink non sécurisé sur votre page. Ce problème de composition est au cœur de la sécurité client-side.

Comment le prévenir et le détecter

  • Préférez les sinks sûrs : textContent plutôt que innerHTML ; évitez entièrement eval et les gestionnaires construits à partir de chaînes.
  • Assainissez quand le HTML est inévitable (DOMPurify ou l'émergente Sanitizer API), et adoptez Trusted Types là où ils sont pris en charge — ils transforment les écritures vers des sinks non sécurisés en violations de politique.
  • Déployez une Content Security Policy stricte avec des nonces ; elle bloque de nombreux styles de payload, mais pas toute la classe d'attaque.
  • Surveillez le comportement à l'exécution : l'exploitation finit par se manifester sous la forme de scripts faisant des choses qu'ils ne devraient pas — nouvelles requêtes sortantes, écritures dans le DOM vers des formulaires de paiement, listeners inattendus. La surveillance client-side de cside observe les sessions réelles au niveau du navigateur, qui est le seul endroit où une attaque limitée au DOM est visible tout court.
Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

Dans le XSS réfléchi, le payload malveillant transite par le serveur et revient intégré dans la réponse HTML. Dans le DOM-based XSS, la réponse du serveur peut être parfaitement propre : le propre JavaScript de la page lit le payload depuis une source client-side (souvent le fragment de l'URL, qui n'est jamais envoyé au serveur) et l'injecte dans le DOM. C'est pourquoi les filtres côté serveur et les WAF, qui inspectent les requêtes et les réponses, peuvent complètement manquer le DOM XSS.

Elle aide, mais ne ferme pas cette classe d'attaque. Une Content Security Policy stricte bloque l'injection de scripts inline et les origines non fiables, ce qui déjoue de nombreux payloads. Mais un DOM XSS exécuté via le sink non sécurisé d'un script figurant sur la liste d'autorisation — ou un payload qui abuse d'une fonctionnalité autorisée du framework — reste conforme à la politique. La CSP est une couche solide ; elle ne remplace ni la correction des sinks non sécurisés ni l'observation de ce que font réellement les scripts à l'exécution.

De manière statique, en auditant les chemins du code depuis les sources (location.hash, location.search, document.referrer, données de postMessage) jusqu'aux sinks (innerHTML, document.write, eval, setAttribute de gestionnaires d'événements). De manière dynamique, avec des scanners conscients du DOM et en surveillant les sessions réelles à la recherche de comportements de scripts inattendus — la vulnérabilité n'existe que dans le navigateur, donc la visibilité au niveau du navigateur est l'endroit où l'exploitation devient observable.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

Interface du tableau de bord cside affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau