Jedna z nejběžnějších tříd zranitelnosti na webových stránkách se nazývá „Cross-Site Scripting“ nebo „XSS“. Chyby zabezpečení XSS jsou místa, kde může uživatel způsobit spuštění JavaScriptu. Existuje řada různých variant zranitelnosti XSS s různou mírou závažnosti.
Problém s tím, že útočník může spouštět JavaScript v relacích jiných uživatelů, je ten, že útočník může s webem, který vidí oběti, udělat cokoli. To zahrnuje přesměrování obětí na externí webové stránky, krádež ověřovacích tokenů a sledování podrobností o platbách.
Nejzávažnější formou XSS zranitelnosti je „Uložené“ nebo „Trvalé“ Cross-Site Scripting, kdy je útočníkovi možné vytvořit datovou část XSS a poté ji odeslat, aby byla uložena v databázi. S exploitem XSS uloženým v databázi je pak možné, aby ovlivnil ostatní uživatele v širokém časovém období.
Další formou Cross-Site Scriptingu je „Odražený“, tento typ se v žádném okamžiku neukládá, místo toho je obsah zahrnut v prohlížeči. Tento typ XSS je obvykle součástí phishingových útoků, kdy se útočník pokouší oklamat oběť, aby klikla na škodlivý odkaz.
Obecně platí, že u většiny útoků XSS je datová část v určitém okamžiku odeslána na server, ale některé útoky jsou čistě na straně klienta, nikdy se neodesílají na server a místo toho ovlivňují pouze JavaScript na straně klienta. Toto se nazývá XSS založené na DOM, protože zůstává v objektovém modelu dokumentu JavaScript nebo DOM. Tento typ zranitelnosti je obzvláště obtížné identifikovat a vyřešit, protože server nikdy neuvidí zneužití, a proto je nelze zaprotokolovat.
Technikou prevence proti zranitelnostem XSS je v minulosti filtrovat všechna data odeslaná uživateli pomocí seznamů blokovaných zpráv k odmítnutí všech zpráv se smysluplnými znaky nebo slovy v JavaScriptu. To vedlo k závodům ve zbrojení při hledání obchvatů pro filtr a zároveň bránilo některým legitimním uživatelským příspěvkům. Správným řešením je použít entity HTML ke kódování dat odeslaných uživatelem. s povolenými moduly entit HTML jsou znaky automaticky zakódovány do formátu, ve kterém je prohlížeč ví, že je má zobrazit jako správné symboly, ale nepovažuje je za kód.