Het grote boze internet, deel 2: XSS en CSRF

XSS: Cross-Site ScriptingVorige week kon je lezen over SQL-injectie, een techniek die aanvallers kunnen gebruiken om de server waarop je website draait aan te vallen. Het artikel van deze week is opnieuw een technisch artikel en het laatste deel van de tweeluik over de beveiliging van je website. Het gaat over Cross-Site Scripting (XSS) en Cross-Site Request Forgery (CSRF): twee client-side aanvallen, waarbij dus jouw website misbruikt wordt voor de doelen van iemand anders.

XSS: Cross-Site Scripting

Cross Site Scripting is het injecteren van kwaadaardige JavaScript-code in pagina’s die een server terugstuurt. Een goed voorbeeld is een gastenboek: gebruikers schrijven berichtjes in een gastenboek, en de server reageert met de lijst van alle berichtjes. Als iemand een berichtje zou kunnen plaatsen met een uitvoerbare JavaScript-code, dan is er sprake van XSS. (Cross-Site Scripting wordt afgekort als XSS: de afkorting CSS was al bezet, en met een beetje fantasie lijkt een X op een kruisje, vandaar.)

Bij een XSS-aanval wordt er kortom een stukje uitvoerbare code in het midden van ‘normale’ tekst gestopt, in de hoop dat browsers het gaan uitvoeren.

R0b3rt zegt:
Leuke site! 
<script>document.location="https://r0b3rt.tk/";</script>

Cross Site Scripting komt, net als SQL-injectie, veel te vaak voor. En dat terwijl de oplossing relatief eenvoudig is.

String escaping

Wie vorige week meegelezen heeft moet hier al een zekere symmetrie zien. Ook voor het voorkomen van XSS is string escaping weer nuttig. In deel 1 was het de bedoeling om invoer van de gebruiker zo te bewerken dat de server het niet als uitvoerbare code zag. Nu doen we hetzelfde voor de client. Het idee is om tekst die de gebruiker invoert en de server teruggeeft, dus reacties in een gastenboek bijvoorbeeld, zo door de mangel te halen dat ze geen kwaad meer kunnen.

String escaping voor HTML is bijna nog makkelijker dan voor SQL. HTML heeft maar een klein aantal speciale tekens. Wie alle punthaken in de invoer door hun HTML-representaties vervangt is eigenlijk al klaar: alle openhaken (<) worden &lt; voor ‘less than’, en alle sluithaken (>) worden &gt;. Daarnaast is het netjes om alle ampersands (&) en aanhalingstekens (“) te vervangen, al kunnen die weinig kwaad. Klinkt redelijk eenvoudig, en dit is precies wat de PHP-functie htmlentities doet. Nu nog onthouden om consequent htmlentities te gebruiken en we zijn 100% beschermd tegen cross-site scripting. Toch?

Verder lezen