En av de vanligaste klasserna av sårbarhet på webbplatser kallas "Cross-Site Scripting" eller "XSS". XSS-sårbarheter är där det är möjligt för en användare att få JavaScript att köras. Det finns ett antal olika varianter av XSS-sårbarhet, med varierande svårighetsgrad.
Problemet med att en angripare kan köra JavaScript i andra användares sessioner är att det då är möjligt för angriparen att göra vad som helst med webbplatsen som offren ser. Detta inkluderar att omdirigera offer till externa webbplatser, stjäla autentiseringstokens och övervaka betalningsdetaljer.
Den allvarligaste formen av XSS-sårbarhet är "Lagrad" eller "Persistent" Cross-Site Scripting, det är här det är möjligt för en angripare att skapa en XSS-nyttolast och sedan skicka in den, så den sparas i databasen. Med en XSS-exploatering sparad i databasen är det sedan möjligt för den att påverka andra användare över en bred tidsperiod.
En annan form av Cross-Site Scripting är "Reflected", denna typ sparas inte vid något tillfälle, istället ingår nyttolasten i webbläsaren. Vanligtvis är denna typ av XSS en del av nätfiskeattacker, där en angripare försöker lura ett offer att klicka på en skadlig länk.
Generellt sett har de flesta XSS-attacker nyttolasten skickad till servern någon gång, men vissa attacker är rent klientsida, skickas aldrig till servern och påverkar istället bara JavaScript på klientsidan. Detta kallas DOM-baserad XSS eftersom det stannar i JavaScript Document Object Model, eller DOM. Denna typ av sårbarhet är särskilt svår att identifiera och lösa eftersom utnyttjandena aldrig ses av servern och därför inte kan loggas.
Historiskt sett är den förebyggande tekniken mot XSS-sårbarheter att filtrera all användarinlämnad data, med hjälp av blocklistor för att avvisa alla meddelanden med meningsfulla tecken eller ord i JavaScript. Detta tenderade att leda till en kapprustning för att hitta förbikopplingar för filtret samtidigt som det förhindrade en del legitima användarbidrag. Den korrekta lösningen är att använda HTML-entiteter för att koda data som användaren skickat in. med HTML-entitetsmoduler aktiverade kodas tecken automatiskt till ett format där webbläsaren vet att de ska visas som de korrekta symbolerna men inte behandla dem som kod.