HTML Academy · Les

XSS via innerHTML en hoe u dit voorkomt

Begrijp cross-site scripting en veilige alternatieven voor innerHTML

Les 2 van 414 stappen

XSS via innerHTML en hoe u dit voorkomt is een gratis HTML Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject HTML Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus HTML Academy bevat in totaal 4 lessen.

De kernkwetsbaarheid

Als je el.innerHTML = userInput instelt, wordt de tekenreeks als HTML geparseerd. Als userInput <script>-tags of attributen voor gebeurtenishandlers bevat (onclick, onerror), interpreteert de browser deze en voert hij door de aanvaller beheerde code op de pagina uit.

Waarom dit vaak voorkomt

Elke code die gebruikersgegevens in HTML interpoleert — serversjablonen of rendering aan clientzijde — loopt XSS-risico als de gegevens niet zijn geëscapet. Singlepage-apps die innerHTML opbouwen uit API-antwoorden zijn vooral kwetsbaar wanneer die antwoorden gebruikersinhoud bevatten.

Een concreet voorbeeld

Een gebruikersnaam "Bob<img src=x onerror=alert(1)>" die via div.innerHTML = `Welcome, ${user}` wordt ingesteld, voert alert(1) uit wanneer de afbeelding niet kan worden geladen. Diezelfde lading als platte tekst (via textContent) is onschadelijk — de browser ziet alleen tekens, geen tags.

// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;

// SAFE
div.textContent = `Hi, ${user.name}`;

Gebruik textContent voor platte tekst

textContent stelt alleen tekst in — speciale HTML-tekens verschijnen als letterlijke tekens, nooit als tags. Dit is in 90% van de gevallen het juiste hulpmiddel. Schakel alleen over naar innerHTML wanneer je daadwerkelijk opmaak moet weergeven, niet tekst.

Gebruik DOM-methoden voor structuur

Als je elementen met gebruikersgegevens wilt maken, bouw je ze op met createElement en textContent: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. Het resultaat is structureel identiek aan innerHTML, maar XSS-veilig door de manier waarop het wordt opgebouwd.

Wanneer je innerHTML moet gebruiken

Voor door de server gegenereerde, vertrouwde HTML (je eigen sjabloonuitvoer of opgeschoonde rijke tekst van een betrouwbare editor) is innerHTML prima. Pas het nooit rechtstreeks toe op gegevens uit onbetrouwbare bronnen zonder ze op te schonen.

Rijke tekst opschonen met DOMPurify

Als gebruikers rijke tekst indienen (een reactieteksteditor of markdownweergave), moet je deze opschonen voordat je innerHTML instelt: el.innerHTML = DOMPurify.sanitize(richHtml). DOMPurify verwijdert gevaarlijke tags en attributen, maar behoudt veilige opmaak zoals <b>, <em> en <a>.

insertAdjacentHTML heeft hetzelfde risico

el.insertAdjacentHTML("beforeend", html) parseert HTML-tekenreeksen — hetzelfde XSS-oppervlak als innerHTML. Dezelfde regels gelden: voer gebruikersgegevens nooit rechtstreeks in; schoon ze op of gebruik DOM-methoden. Hetzelfde geldt voor document.write, al zou niemand dat tegenwoordig nog moeten gebruiken.

Standaardinstellingen van frameworks

React, Vue, Svelte en Angular escapen geïnterpoleerde tekst standaard — {name} is veilig. Ze bieden uitzonderingsmechanismen (dangerouslySetInnerHTML in React en v-html in Vue) die hetzelfde XSS-risico met zich meebrengen; gebruik ze spaarzaam en met opschoning.

Injectie in attributen

Zelfs attribuutwaarden kunnen een aanvalsvector zijn: <a href={url}> met url="javascript:alert(1)" voert code uit wanneer erop wordt geklikt. Valideer URL-schema's een voor een (sta alleen http:, https:, mailto: en tel: toe) voordat je gebruikersinvoer in href, src of andere attributen met een URL plaatst.

Trusted Types-beleid

Moderne browsers ondersteunen Trusted Types: configureer CSP met require-trusted-types-for 'script', waarna innerHTML onbewerkte tekenreeksen weigert — alleen door een beleid verpakte waarden worden geaccepteerd. Zo wordt XSS onmogelijk door de API in plaats van door discipline.

Gelaagde beveiliging

Geen enkele laag is voldoende. Combineer: invoervalidatie op de server, escaping van uitvoer bij het renderen, CSP om geïnjecteerde scripts te blokkeren, Trusted Types om onbewerkte tekenreeksen te weigeren, en een beveiligingsreview voor elk gebruik van innerHTML. Gelaagde beveiliging blijft werken als er in één laag een fout zit.

Kennischeck

Waarom is el.textContent = userInput veilig tegen XSS, terwijl el.innerHTML = userInput gevaarlijk is?

Samenvatting

innerHTML op gebruikersinvoer is de klassieke XSS-vector. Gebruik textContent voor tekst, createElement+textContent voor structuur en DOMPurify wanneer rijke HTML nodig is. Valideer URL-schema's voor attribuutwaarden. Combineer CSP en Trusted Types om fouten die door de code-review glippen onschadelijk te maken. Moderne frameworks escapen standaard — houd hun onveilige ontsnappingsmogelijkheden zeldzaam en laat ze reviewen.

Gratis beginnen

Leer HTML met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
40
Lessen
159

Veelgestelde vragen

Is de les “XSS via innerHTML en hoe u dit voorkomt” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad HTML Academy, waaronder “XSS via innerHTML en hoe u dit voorkomt”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus HTML Academy bevat in totaal 4 lessen.

Wat leer ik in “XSS via innerHTML en hoe u dit voorkomt”?

Begrijp cross-site scripting en veilige alternatieven voor innerHTML Je oefent met HTML Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met HTML Academy te beginnen?

Ervaring vooraf is niet nodig. HTML Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “XSS via innerHTML en hoe u dit voorkomt”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over HTML Academy?

Ja. Elke les over HTML Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Content Security Policy: meta http-equiv
  2. XSS via innerHTML en hoe u dit voorkomt
  3. iframe-sandboxing en Permissions Policy
  4. HTTPS en Subresource Integrity
← Terug naar HTML Academy