Een van de meest voorkomende vormen van kwetsbaarheid op websites wordt "Cross-Site Scripting" of "XSS" genoemd. XSS-kwetsbaarheden zijn waar het voor een gebruiker mogelijk is om JavaScript uit te voeren. Er zijn een aantal verschillende varianten van XSS-kwetsbaarheid, met verschillende gradaties van ernst.
Het probleem met een aanvaller die JavaScript kan uitvoeren in de sessies van andere gebruikers, is dat de aanvaller dan alles kan doen met de website die de slachtoffers zien. Dit omvat het omleiden van slachtoffers naar externe websites, het stelen van authenticatietokens en het controleren van betalingsgegevens.
De meest ernstige vorm van XSS-kwetsbaarheid is "Stored" of "Persistent" Cross-Site Scripting, dit is waar het is mogelijk voor een aanvaller om een XSS-payload te maken en deze vervolgens in te dienen, zodat deze wordt opgeslagen in de database. Met een XSS-exploit die in de database is opgeslagen, is het dan mogelijk dat deze andere gebruikers over een brede periode beïnvloedt.
Een andere vorm van Cross-Site Scripting is "Reflected", dit type wordt op geen enkel moment opgeslagen, in plaats daarvan wordt de payload opgenomen in de browser. Meestal maakt dit type XSS deel uit van phishing-aanvallen, waarbij een aanvaller probeert een slachtoffer te misleiden om op een schadelijke link te klikken.
Over het algemeen wordt bij de meeste XSS-aanvallen de payload op een bepaald moment naar de server gestuurd, maar sommige aanvallen zijn: puur aan de clientzijde, wordt nooit naar de server verzonden en heeft in plaats daarvan alleen invloed op de clientzijde JavaScript. Dit wordt op DOM gebaseerde XSS genoemd omdat het in het JavaScript Document Object Model of DOM blijft. Dit type kwetsbaarheid is bijzonder moeilijk te identificeren en op te lossen omdat de exploits nooit door de server worden gezien en dus niet kunnen worden vastgelegd.
Historisch gezien is de preventietechniek tegen XSS-kwetsbaarheden het filteren van alle door gebruikers ingediende gegevens, met behulp van blokkeerlijsten om berichten met betekenisvolle tekens of woorden in JavaScript te weigeren. Dit leidde meestal tot een wapenwedloop om bypasses voor het filter te vinden, terwijl ook enkele legitieme gebruikersinzendingen werden voorkomen. De juiste oplossing is om HTML-entiteiten te gebruiken om door de gebruiker ingediende gegevens te coderen. als HTML-entiteitsmodules zijn ingeschakeld, worden tekens automatisch gecodeerd in een indeling waarin de browser ze als de juiste symbolen weet weer te geven, maar ze niet als code moet behandelen.