Sécurité

XSS-bescherming: de volledige gids

Cross-site scripting (XSS) is de meest voorkomende webkwetsbaarheid. Leer hoe u uw website effectief beschermt.

15 mars 20264 min de lectureWarDek Team

Wat is XSS?

Cross-Site Scripting (XSS) is een kwetsbaarheid waarbij een aanvaller kwaadaardige scripts injecteert in webpagina's die door andere gebruikers worden bekeken. Het is al jaren de meest voorkomende webkwetsbaarheid volgens OWASP en treft naar schatting 65% van alle webapplicaties.

De impact is ernstig: sessiediefstal, accountovername, gegevensdiefstal, malwareverspreiding en defacement.

De drie typen XSS

1. Reflected XSS

Het script wordt meegestuurd in het verzoek (bijv. URL-parameter) en direct teruggekaatst in de response zonder sanitization.

Voorbeeld: een zoekterm die ongeëscaped op de pagina wordt getoond. Als een aanvaller een URL deelt met een kwaadaardig script als zoekparameter, wordt dat script uitgevoerd in de browser van het slachtoffer.

Aanvalsvector: via phishing-e-mails of kwaadaardige links.

2. Stored XSS

Het script wordt opgeslagen in de database (bijv. via een formulier, commentaar of profielveld) en vervolgens getoond aan elke bezoeker die de betreffende pagina bekijkt.

Voorbeeld: een aanvaller plaatst een reactie die een verborgen script-tag bevat. Elke bezoeker die de reacties leest, voert onbewust het script uit.

Impact: potentieel alle bezoekers van de pagina.

3. DOM-based XSS

Het script wordt niet door de server verwerkt maar direct door client-side JavaScript. De kwetsbaarheid zit in de manier waarop JavaScript data uit de URL of DOM verwerkt.

Voorbeeld: JavaScript dat URL-fragmenten direct in de DOM schrijft via innerHTML zonder sanitization.

Beschermingsmaatregelen

Laag 1: Output encoding

De primaire verdediging. Codeer alle dynamische data voordat het in de HTML wordt geplaatst.

| Context | Encoding | Voorbeeld | |---|---|---| | HTML body | HTML entity encoding | < wordt &lt; | | HTML attributen | Attribute encoding | " wordt &quot; | | JavaScript | JavaScript encoding | Speciale tekens worden geëscaped | | URL-parameters | URL encoding | < wordt %3C | | CSS | CSS encoding | Speciale tekens worden geëscaped |

Moderne frameworks zoals React, Vue en Angular voeren standaard output encoding uit. Maar let op: elke framework biedt ook een "escape hatch" voor het renderen van raw HTML. Deze functies (zoals het direct zetten van innerHTML) mogen nooit worden gebruikt met onvertrouwde data.

Laag 2: Content Security Policy (CSP)

CSP is uw tweede verdedigingslinie. Zelfs als output encoding faalt, kan CSP voorkomen dat geïnjecteerde scripts worden uitgevoerd.

Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'; object-src 'none'

Essentieel:

Laag 3: Inputvalidatie

Valideer invoer serverzijdig op type, lengte, formaat en bereik. Inputvalidatie is een aanvulling op output encoding, niet een vervanging.

import { z } from 'zod';

const commentSchema = z.object({
  name: z.string().min(1).max(100),
  email: z.string().email(),
  body: z.string().min(1).max(5000),
});

Laag 4: Cookie-bescherming

Bescherm sessiecookies zodat XSS niet direct tot sessiediefstal leidt:

Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Strict; Path=/

| Attribuut | Bescherming | |---|---| | HttpOnly | Cookie niet toegankelijk via JavaScript | | Secure | Alleen via HTTPS verzonden | | SameSite=Strict | Niet meegezonden bij cross-site requests |

Laag 5: HTML-sanitization

Wanneer u rich text moet accepteren (bijv. WYSIWYG-editors), gebruik dan een bewezen sanitization-library zoals DOMPurify (client-side) of sanitize-html (server-side).

import DOMPurify from 'dompurify';

const cleanHtml = DOMPurify.sanitize(userInput, {
  ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p', 'br'],
  ALLOWED_ATTR: ['href'],
});

Accepteer nooit ongefilterde HTML van gebruikers.

Veelgemaakte fouten

| Fout | Waarom het fout gaat | |---|---| | Alleen client-side validatie | Aanvaller omzeilt de browser (cURL, Postman) | | Blacklist-benadering | Aanvallers vinden altijd omwegen met creatieve syntax | | Vertrouwen op X-XSS-Protection header | Legacy filter; kan zelfs kwetsbaarheden introduceren | | innerHTML gebruiken met gebruikersdata | Direct DOM-based XSS | | Rich text accepteren zonder sanitization | Stored XSS via formatted content | | CSP met unsafe-inline | XSS-bescherming van CSP effectief uitgeschakeld |

XSS testen

Handmatige tests

Probeer veelvoorkomende XSS-payloads in invoervelden. Test met script-tags, event handlers (onerror, onload), en JavaScript-URI's. Als uw applicatie een van deze payloads terugkaatst zonder encoding, heeft u een kwetsbaarheid.

Geautomatiseerd testen

Geautomatiseerde scanners testen systematisch honderden XSS-vectors tegen alle invoerpunten van uw applicatie. Dit is effectiever dan handmatig testen en vindt kwetsbaarheden die u mist.

XSS en compliance in Nederland

XSS-kwetsbaarheden hebben directe implicaties voor compliance. Onder de AVG (GDPR) zijn organisaties verplicht passende technische maatregelen te treffen om persoonsgegevens te beschermen (art. 32). Een XSS-kwetsbaarheid die leidt tot sessiediefstal of gegevensdiefstal kan worden beschouwd als een datalek dat gemeld moet worden bij de Autoriteit Persoonsgegevens.

In het kader van de Cyberbeveiligingswet (NIS2-implementatie) worden organisaties in kritieke sectoren geacht hun webapplicaties actief te beveiligen tegen veelvoorkomende kwetsbaarheden zoals XSS. Het NCSC benoemt cross-site scripting expliciet als een van de belangrijkste webbedreigingen in hun beveiligingsrichtlijnen.

De OWASP Top 10, waarin injection-kwetsbaarheden (inclusief XSS) prominent voorkomen, wordt door het NCSC en het Digital Trust Center als referentiekader gebruikt voor het beoordelen van de beveiliging van webapplicaties. Regelmatige geautomatiseerde scans op XSS-kwetsbaarheden zijn een effectieve manier om uw beveiliging doorlopend te toetsen.

Conclusie

XSS-bescherming vereist een defense-in-depth benadering: output encoding als basis, CSP als vangnet, inputvalidatie als aanvulling, en cookie-beveiliging om de impact te beperken. Geen enkele maatregel is op zichzelf voldoende.

Scan uw website gratis met WarDek — OWASP, NIS2, AVG, AI Act compliance in één scan.

#XSS#beveiliging#webapplicaties#OWASP

Scannez votre site gratuitement

WarDek détecte les vulnérabilités mentionnées dans cet article en quelques secondes.

Retour à Sécurité