Cross-Site Scripting (XSS)

XSS, Cross-Site Scripting-aanval, Script-injectie, Cross-site scripting, XSS-kwetsbaarheid, Client-side code injectie, JavaScript-injectie aanval
Cross-Site Scripting (XSS) is een veelvoorkomende beveiligingskwetsbaarheid waarbij aanvallers kwaadaardige scripts in webpagina's injecteren die vervolgens worden uitgevoerd in de browsers van andere gebruikers.

Wat is Cross-Site Scripting (XSS)?

Cross-Site Scripting (XSS) is een van de meest voorkomende en gevaarlijke beveiligingslekken in webapplicaties. Bij een XSS-aanval slaagt een aanvaller erin om kwaadaardige scripts, meestal JavaScript, te injecteren in webpagina's die door andere gebruikers worden bekeken. Deze scripts worden vervolgens uitgevoerd in de browser van het slachtoffer, waardoor de aanvaller toegang kan krijgen tot gevoelige informatie zoals cookies, sessietokens en andere vertrouwelijke gegevens.

Het gevaar van XSS schuilt in het feit dat de aanval plaatsvindt binnen de context van een vertrouwde website. De browser van het slachtoffer heeft geen manier om te onderscheiden tussen legitieme scripts van de website en kwaadaardige scripts die door een aanvaller zijn geïnjecteerd. Hierdoor kunnen aanvallers gebruikersgegevens stelen, accounts overnemen, malware verspreiden of gebruikers omleiden naar phishing-websites.

Typen XSS-aanvallen

Er zijn drie hoofdtypen van XSS-aanvallen, elk met hun eigen karakteristieken en risico's:

  • Reflected XSS (Gereflecteerde XSS): De meest voorkomende vorm waarbij kwaadaardige scripts worden meegestuurd in een HTTP-verzoek en direct worden teruggegeven in de response. Dit gebeurt vaak via URL-parameters of formuliervelden. De aanval is niet permanent opgeslagen op de server.
  • Stored XSS (Opgeslagen XSS): Ook wel persistente XSS genoemd. Hierbij wordt het kwaadaardige script permanent opgeslagen op de doelserver, bijvoorbeeld in een database, forum, berichtenarchief of commentaarsectie. Elke gebruiker die de geïnfecteerde pagina bezoekt, wordt getroffen.
  • DOM-based XSS: Deze aanval vindt volledig plaats in de client-side code. Het kwaadaardige script wordt uitgevoerd als resultaat van het wijzigen van de DOM-omgeving in de browser van het slachtoffer, zonder dat de server betrokken is.

Hoe werkt een XSS-aanval?

Een typische XSS-aanval volgt dit patroon:

  1. De aanvaller identificeert een kwetsbaarheid in een webapplicatie waar gebruikersinvoer niet correct wordt gevalideerd of geëscaped.
  2. De aanvaller creëert een kwaadaardige payload, meestal JavaScript-code, en injecteert deze via een invoerveld, URL-parameter of andere input-methode.
  3. De webapplicatie neemt de kwaadaardige input op in de HTML-output zonder deze correct te filteren.
  4. Wanneer een slachtoffer de geïnfecteerde pagina bezoekt, wordt het script uitgevoerd in hun browser.
  5. Het script kan vervolgens cookies stelen, sessies kapen, toetsaanslagen vastleggen of andere kwaadaardige acties uitvoeren.

Gevolgen van XSS-aanvallen

De impact van een succesvolle XSS-aanval kan aanzienlijk zijn:

  • Diefstal van gevoelige gegevens: Aanvallers kunnen cookies, sessietokens en andere authenticatiegegevens stelen.
  • Account overname: Met gestolen sessiegegevens kunnen aanvallers zich voordoen als legitieme gebruikers.
  • Defacement: De aanvaller kan de inhoud van de webpagina wijzigen om misleidende of schadelijke informatie weer te geven.
  • Phishing: Gebruikers kunnen worden omgeleid naar valse inlogpagina's.
  • Malware verspreiding: Scripts kunnen worden gebruikt om malware te downloaden op de computers van slachtoffers.
  • Reputatieschade: Een XSS-kwetsbaarheid kan het vertrouwen in een website of merk ernstig beschadigen.

Toepassingen en bescherming tegen XSS

Preventie en beschermingsmaatregelen

Het voorkomen van XSS-aanvallen vereist een meerlaagse beveiligingsstrategie. Hier zijn de belangrijkste beschermingsmaatregelen:

Input validatie en sanitization

Alle gebruikersinvoer moet worden behandeld als potentieel gevaarlijk:

  • Whitelist validatie: Accepteer alleen invoer die voldoet aan strikte criteria en verwerp alles wat niet aan het verwachte patroon voldoet.
  • Input filtering: Verwijder of neutraliseer potentieel gevaarlijke karakters en scripts uit gebruikersinvoer.
  • Type checking: Valideer dat invoer het verwachte datatype heeft (bijvoorbeeld numeriek, e-mail, datum).
  • Lengtebeperkingen: Implementeer maximale lengtes voor invoervelden om complexe aanvallen te beperken.

Output encoding en escaping

Zorg ervoor dat alle gebruikersgegeveerde content correct wordt geëncodeerd voordat deze wordt weergegeven:

  • HTML entity encoding: Converteer speciale karakters zoals <, >, ", ' en & naar hun HTML-entiteiten.
  • JavaScript encoding: Gebruik specifieke encoding wanneer data in JavaScript-context wordt gebruikt.
  • URL encoding: Encodeer data die in URLs wordt gebruikt om injectie via URL-parameters te voorkomen.
  • CSS encoding: Pas speciale encoding toe voor data die in CSS-context wordt gebruikt.

Content Security Policy (CSP)

Implementeer een robuuste Content Security Policy om te bepalen welke bronnen mogen worden geladen:

  • Definieer toegestane bronnen voor scripts, stylesheets, afbeeldingen en andere resources.
  • Blokkeer inline scripts en eval() functies waar mogelijk.
  • Gebruik nonces of hashes voor toegestane inline scripts.
  • Implementeer strict-dynamic voor moderne browsers.

HTTP-only en Secure cookies

Bescherm sessiecookies tegen diefstal:

  • Gebruik de HttpOnly flag om te voorkomen dat JavaScript toegang heeft tot cookies.
  • Implementeer de Secure flag om cookies alleen via HTTPS te verzenden.
  • Gebruik de SameSite attribuut om CSRF-aanvallen te beperken.

Testing en monitoring

Regelmatige controle op XSS-kwetsbaarheden is essentieel:

  • Automatische scanners: Gebruik tools zoals OWASP ZAP, Burp Suite of Acunetix om regelmatig te scannen op kwetsbaarheden.
  • Penetration testing: Laat ethische hackers uw applicatie testen op beveiligingslekken.
  • Code reviews: Voer regelmatige beveiligingsgerichte code reviews uit.
  • Security monitoring: Implementeer logging en monitoring om verdachte activiteiten te detecteren.
  • Bug bounty programma's: Moedig beveiligingsonderzoekers aan om kwetsbaarheden te rapporteren.

Framework-specifieke bescherming

Moderne webframeworks bieden ingebouwde bescherming tegen XSS:

  • React: Automatische escaping van content in JSX, maar wees voorzichtig met dangerouslySetInnerHTML.
  • Angular: Ingebouwde sanitization voor templates en automatische encoding.
  • Vue.js: Automatische HTML-escaping in templates, vermijd v-html waar mogelijk.
  • Django: Automatische HTML-escaping in templates, gebruik safe filter bewust.
  • Ruby on Rails: Standaard HTML-escaping, gebruik raw() helper met voorzichtigheid.

Best practices voor ontwikkelaars

Volg deze richtlijnen om XSS-kwetsbaarheden te voorkomen:

  • Behandel alle gebruikersinvoer als onbetrouwbaar, ongeacht de bron.
  • Gebruik gevestigde beveiligingsbibliotheken in plaats van eigen oplossingen te bouwen.
  • Implementeer defense in depth: meerdere beveiligingslagen zijn beter dan één.
  • Houd frameworks en bibliotheken up-to-date met de laatste beveiligingspatches.
  • Educeer het ontwikkelteam over beveiligingsbest practices.
  • Implementeer een secure development lifecycle (SDL).
  • Gebruik parameterized queries om SQL-injectie te voorkomen (gerelateerd aan XSS).

Veelgestelde vragen

Hoewel beide injectie-aanvallen zijn, richten ze zich op verschillende aspecten van een webapplicatie. XSS (Cross-Site Scripting) richt zich op de client-side en injecteert kwaadaardige scripts die worden uitgevoerd in de browser van gebruikers. Het doel is meestal het stelen van gebruikersgegevens of het manipuleren van de gebruikerservaring.

SQL-injectie daarentegen richt zich op de server-side en probeert kwaadaardige SQL-commando's in tejecteren in database queries. Het doel is meestal om ongeautoriseerde toegang te krijgen tot de database, gegevens te wijzigen of te verwijderen.

Beide kwetsbaarheden ontstaan door onvoldoende validatie van gebruikersinvoer, maar vereisen verschillende beschermingsmaatregelen. XSS wordt voorkomen door output encoding en CSP, terwijl SQL-injectie wordt voorkomen door parameterized queries en prepared statements.

WordPress heeft ingebouwde beveiligingsfuncties, maar er zijn extra stappen die je kunt nemen om XSS-aanvallen te voorkomen:

  • Houd alles up-to-date: Update regelmatig WordPress core, thema's en plugins naar de nieuwste versies met beveiligingspatches.
  • Gebruik beveiligingsplugins: Installeer plugins zoals Wordfence, Sucuri of iThemes Security die XSS-bescherming bieden.
  • Valideer gebruikersinvoer: Gebruik WordPress functies zoals sanitize_text_field(), esc_html(), en esc_attr() in custom code.
  • Beperk gebruikersrechten: Geef gebruikers alleen de minimaal benodigde rechten.
  • Implementeer CSP headers: Configureer Content Security Policy via je .htaccess of beveiligingsplugin.
  • Controleer thema's en plugins: Gebruik alleen betrouwbare bronnen en controleer code op beveiligingsissues.
  • Schakel file editing uit: Voeg define('DISALLOW_FILE_EDIT', true); toe aan wp-config.php.

Als je vermoedt dat je website is getroffen door een XSS-aanval, neem dan onmiddellijk deze stappen:

Directe actie:

  • Isoleer de kwetsbaarheid en haal de geïnfecteerde pagina's offline indien nodig.
  • Wijzig alle wachtwoorden en API-keys, vooral van beheerdersaccounts.
  • Controleer logbestanden om de omvang van de aanval te bepalen.
  • Informeer getroffen gebruikers en adviseer hen hun wachtwoorden te wijzigen.

Herstel en preventie:

  • Identificeer en patch de kwetsbaarheid die de aanval mogelijk maakte.
  • Scan de gehele website op malware en backdoors.
  • Herstel de website vanaf een schone backup indien nodig.
  • Implementeer extra beveiligingsmaatregelen zoals CSP en input validatie.
  • Voer een volledige beveiligingsaudit uit om andere kwetsbaarheden te identificeren.
  • Overweeg een beveiligingsexpert in te schakelen voor een grondige analyse.
  • Documenteer het incident en leer ervan voor toekomstige preventie.

Neem bij ernstige datalekken contact op met de relevante autoriteiten zoals de Autoriteit Persoonsgegevens conform AVG-wetgeving.

Auteur & updates

Auteur: Wouter
Publicatiedatum: 16-02-2026
Laatste update: 16-02-2026