Stel je voor dat je een website bezoekt die je vertrouwt, zoals je favoriete nieuwsplatform of sociale media. Zonder dat je het weet, voert jouw browser op de achtergrond schadelijke code uit die daar door een hacker is geplaatst. Dit is geen sciencefiction; het is een veelvoorkomende cyberaanval genaamd Cross-Site Scripting, oftewel XSS.
In dit artikel duiken we in de wereld van XSS. We leggen uit wat het is, hoe het werkt, waarom het zo gevaarlijk is en, belangrijker nog, hoe je jezelf en je gebruikers ertegen kunt beschermen.
Wat is Cross-Site Scripting (XSS)?
Cross-Site Scripting is een type aanval waarbij een aanvaller kwaadaardige scripts injecteert in websites die door anderen worden vertrouwd. In tegenstelling tot veel andere aanvallen die gericht zijn op de server, is XSS een zogenaamde client-side code injection attack. Dit betekent dat de kwaadaardige code niet op de server van de website draait, maar direct in de browser van de nietsvermoedende bezoeker.
Het doel van een XSS-aanval is vaak het stelen van gevoelige informatie, zoals inloggegevens of persoonlijke data, door de browser van het slachtoffer te manipuleren.

Hoe werkt een XSS-aanval?
Het basisprincipe is eenvoudig: een aanvaller vindt een manier om zijn eigen script (meestal JavaScript) op een legitieme webpagina te krijgen. Wanneer een gebruiker die pagina bezoekt, ziet hun browser het script als een normaal onderdeel van de website en voert het uit.
Een klassiek voorbeeld is een reactieveld op een blog of forum dat niet goed beveiligd is. Een aanvaller zou een reactie kunnen plaatsen die er als volgt uitziet:
<script>alert('Je bent gehackt!');</script>
Als de website deze tekst direct op de pagina weergeeft zonder deze te ‘zuiveren’, zal de browser van elke bezoeker die de reactie laadt, het script uitvoeren en een pop-upvenster tonen met de tekst “Je bent gehackt!”. In werkelijkheid gebruiken aanvallers natuurlijk veel schadelijkere scripts.
Waarom is XSS zo gevaarlijk?
JavaScript is een krachtige taal die veel mag in de browser. Dit maakt XSS-aanvallen bijzonder gevaarlijk. Een aanvaller kan via JavaScript onder andere:
- Cookies stelen: Dit is het meest voorkomende doel. Cookies bevatten vaak sessie-informatie, waarmee een aanvaller direct kan inloggen op het account van het slachtoffer zonder wachtwoord.
- Inloggegevens onderscheppen: Een script kan een nep-inlogscherm over het echte scherm plaatsen en de ingevoerde gebruikersnaam en wachtwoord naar de aanvaller sturen.
- Toegang krijgen tot gevoelige data: Denk aan geolocatie, webcamgegevens (met toestemming van de gebruiker, die vaak wordt misleid) of gegevens uit andere openstaande tabbladen.
- De gebruiker omleiden: Het slachtoffer kan ongemerkt worden doorgestuurd naar een kwaadaardige website.
- De inhoud van de pagina aanpassen: De aanvaller kan de tekst of afbeeldingen op de website veranderen om desinformatie te verspreiden of de gebruiker te misleiden.
Het verraderlijke is dat de gebruiker vaak niets merkt, omdat de aanval plaatsvindt op een website die ze vertrouwen.
De Twee Hoofdvormen van XSS
Er zijn verschillende manieren waarop een XSS-aanval kan worden uitgevoerd, maar de twee meest voorkomende zijn:
1. Reflected XSS
Bij deze vorm wordt de kwaadaardige code ‘gereflecteerd’ door de webapplicatie. De code wordt niet permanent opgeslagen op de server, maar zit verstopt in een URL. De aanvaller moet het slachtoffer verleiden om op een speciaal geprepareerde link te klikken, vaak via een phishing-e-mail.
Een voorbeeld van zo’n link zou kunnen zijn: http://vertrouwde-bank.nl/zoek?q=<script>stuur_cookies_naar_aanvaller()</script>
Als de website de zoekopdracht (q) direct op de resultatenpagina weergeeft zonder deze te beveiligen, wordt het script uitgevoerd in de browser van de gebruiker die op de link klikt.
2. Persistent (of Stored) XSS
Dit is de gevaarlijkere variant. Hierbij wordt het kwaadaardige script permanent opgeslagen op de server van de website. Dit gebeurt vaak via functionaliteiten waar gebruikers content kunnen plaatsen, zoals:
- Reactieformulieren op blogs
- Profielpagina’s op sociale media
- Berichten op forums
Een aanvaller plaatst het script eenmalig (bijvoorbeeld in een forumbericht). Vervolgens wordt dit script automatisch uitgevoerd bij elke gebruiker die dat specifieke bericht bekijkt. De impact is hierdoor veel groter dan bij reflected XSS.
Hoe Voorkom je Cross-Site Scripting?
Het voorkomen van XSS is een cruciale verantwoordelijkheid voor elke webontwikkelaar. Er is niet één magische oplossing, maar een combinatie van maatregelen biedt een sterke verdediging.
1. Input Validatie (Controleer wat er binnenkomt)
Vertrouw nooit data die van een gebruiker komt. Stel strikte regels op voor wat wel en niet is toegestaan in invoervelden. Als een veld bedoeld is voor een achternaam, sta dan alleen letters en eventueel leestekens toe, en blokkeer tekens zoals < en > die nodig zijn voor HTML-tags.
2. Output Encoding (Beveilig wat er uitgaat)
Dit is de belangrijkste verdedigingslinie. Voordat je door gebruikers ingevoerde data op een pagina weergeeft, moet je deze ‘coderen’. Dit betekent dat speciale tekens worden omgezet in hun veilige HTML-equivalenten. Bijvoorbeeld, <script> wordt omgezet in <script>. De browser zal dit weergeven als platte tekst in plaats van het uit te voeren als code.
3. Content Security Policy (CSP)
Een CSP is een krachtige beveiligingslaag die je als een HTTP-header aan je website toevoegt. Hiermee vertel je de browser van de bezoeker exact welke bronnen (scripts, afbeeldingen, stijlen) vertrouwd zijn en geladen mogen worden. Een goed ingestelde CSP kan de meeste XSS-aanvallen blokkeren, zelfs als er een lek in je code zit.
4. Veilige Cookie-instellingen
Om te voorkomen dat cookies worden gestolen via XSS, kun je de HttpOnly-vlag instellen op gevoelige cookies (zoals sessie-cookies). Dit zorgt ervoor dat deze cookies niet via JavaScript kunnen worden uitgelezen, waardoor ze veilig zijn voor een groot deel van de XSS-aanvallen.
Conclusie
Cross-Site Scripting is een serieuze en veelvoorkomende bedreiging die misbruik maakt van het vertrouwen dat gebruikers hebben in websites. Het stelt aanvallers in staat om code uit te voeren in de browser van slachtoffers, met potentieel ernstige gevolgen zoals identiteitsdiefstal. Door als ontwikkelaar bewust te zijn van de risico’s en consequent beveiligingsmaatregelen toe te passen zoals input validatie, output encoding en een Content Security Policy, kun je je gebruikers effectief beschermen tegen deze verraderlijke aanvallen.