Skip to main content
Blog
Blog security

Wat is DOM-based XSS? Hoe cross-site scripting in de DOM werkt

DOM-based XSS is een cross-site scripting-aanval waarbij de kwetsbaarheid volledig in client-side JavaScript zit: de eigen code van de pagina leest door de aanvaller gecontroleerde invoer en schrijft die onveilig naar de DOM. Deze gids legt uit hoe het verschilt van reflected en stored XSS, welke sources en sinks veel voorkomen, en hoe je het detecteert.

Aug 18, 2026 3 min read
Wat is DOM-based XSS? Hoe cross-site scripting in de DOM werkt
Inhoudsopgave

DOM-based XSS is een cross-site scripting-kwetsbaarheid die volledig in client-side code zit. De eigen JavaScript van de pagina leest invoer die de aanvaller kan beïnvloeden — meestal uit de URL — en schrijft die naar de DOM via een onveilige sink zoals innerHTML, waardoor het script van de aanvaller wordt uitgevoerd. Anders dan bij reflected of stored XSS hoeft de kwaadaardige payload nooit in een serverrespons te verschijnen.

Hoe werkt een DOM XSS-aanval?

De kwetsbaarheid is een datastroom van een source die de aanvaller beheerst naar een sink die tekst als code of markup interpreteert:

// 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()>

Veelvoorkomende sources: location.hash, location.search, document.referrer, window.name, postMessage-data en client-side opslag. Veelvoorkomende sinks: innerHTML/outerHTML, document.write, eval en Function, jQuery's .html(), en attribuutschrijfacties die handlers of URL's aanmaken (onclick, href met javascript:).

Omdat het URL-fragment nooit naar de server wordt verzonden, kan een payload na # de pagina exploiteren terwijl de server een volkomen normale request ziet.

Reflected vs stored vs DOM-based XSS

Reflected XSSStored XSSDOM-based XSS
Waar de payload leeftIn de request, teruggekaatst door de serverIn de database van de serverIn client-side invoer (vaak het URL-fragment)
Bevat de serverrespons de payload?Vaak ✗
Zichtbaar voor WAF's / serverlogsMeestalMeestalVaak niet
Waar het wordt opgelostServer-side output-encodingServer-side sanitization + encodingClient-side code: veilige sinks, sanitization

Waarom DOM XSS makkelijk te missen is

Server-side verdedigingen inspecteren requests en responses; DOM XSS kan beide omzeilen. Frameworks verkleinen het risico — React en soortgelijke escapen standaard — maar dangerouslySetInnerHTML, verkeerd templategebruik en de third-party scripts op de pagina brengen het terug. En een moderne pagina draait tientallen scripts die je niet zelf hebt geschreven: een onveilige sink in een daarvan is een onveilige sink op jouw pagina. Dat compositieprobleem is de kern van client-side security.

Hoe je het voorkomt en detecteert

  • Geef de voorkeur aan veilige sinks: textContent boven innerHTML; vermijd eval en uit strings opgebouwde handlers volledig.
  • Sanitize wanneer HTML onvermijdelijk is (DOMPurify of de opkomende Sanitizer API), en gebruik Trusted Types waar ondersteund — die maken van onveilige sink-schrijfacties beleidsschendingen.
  • Zet een strikte Content Security Policy in met nonces; die blokkeert veel payloadstijlen, maar niet de hele aanvalsklasse.
  • Houd runtimegedrag in de gaten: exploitatie manifesteert zich uiteindelijk als scripts die dingen doen die niet horen — nieuwe uitgaande requests, DOM-schrijfacties in betaalformulieren, onverwachte listeners. De client-side monitoring van cside observeert echte sessies op browserniveau, de enige plek waar een aanval die alleen in de DOM bestaat überhaupt zichtbaar is.
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

Bij reflected XSS reist de kwaadaardige payload naar de server en komt terug ingebed in de HTML-respons. Bij DOM-based XSS kan de serverrespons volledig schoon zijn: de eigen JavaScript van de pagina leest de payload uit een client-side source (vaak het URL-fragment, dat nooit naar de server wordt verzonden) en injecteert die in de DOM. Daarom kunnen server-side filters en WAF's, die requests en responses inspecteren, DOM XSS volledig missen.

Het helpt, maar sluit de aanvalsklasse niet af. Een strikte Content Security Policy blokkeert inline scriptinjectie en niet-vertrouwde bronnen, wat veel payloads verslaat. Maar DOM XSS dat wordt uitgevoerd via de eigen onveilige sink van een toegestaan script — of een payload die een toegestane frameworkfunctie misbruikt — blijft binnen het beleid. CSP is een sterke laag; het is geen vervanging voor het repareren van onveilige sinks of het volgen van wat scripts tijdens runtime werkelijk doen.

Statisch, door codepaden te auditen van sources (location.hash, location.search, document.referrer, postMessage-data) naar sinks (innerHTML, document.write, eval, setAttribute van event handlers). Dynamisch, met DOM-bewuste scanners en door echte sessies te monitoren op onverwacht scriptgedrag — de kwetsbaarheid bestaat alleen in de browser, dus zichtbaarheid op browserniveau is waar exploitatie waarneembaar wordt.

Monitor en beveilig je third-party scripts

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

Start gratis, of probeer Business met een proefperiode van 14 dagen.

cside-dashboardinterface met scriptmonitoring en beveiligingsanalyses
Related Articles
Boek een demo

Wil je dit doornemen met een engineer?

Dertig minuten, op je eigen site. Geen slides.

We laten je zien:

Welke scripts van derden er nu op je site draaien
Hoe je ervoor staat op PCI DSS 6.4.3 en 11.6.1
Welk deel van je verkeer uit bots en AI-agents bestaat

Liever gewoon een vraag stellen?

Vrije momenten zoeken…

Alleen echte mensen. Wij merken het.

Lukt het boeken niet? Agenda in een nieuw tabblad openen

Wat wil je oplossen?

Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

Waar we meestal mee helpen:

Zien welke scripts van derden op je site draaien
Bewijs voor PCI DSS 6.4.3 en 11.6.1
Bots, AI-agents en accountovername

Liever meteen een moment inplannen? Kies een tijdstip