Una de les classes de vulnerabilitat més comunes als llocs web s'anomena "Cross-Site Scripting" o "XSS". Les vulnerabilitats XSS són on és possible que un usuari faci que s'executi JavaScript. Hi ha diverses variants de vulnerabilitat XSS, amb diferents graus de gravetat.
El problema amb que un atacant pugui executar JavaScript a les sessions d'altres usuaris és que llavors és possible que l'atacant faci qualsevol cosa al lloc web que veuen les víctimes. Això inclou redirigir les víctimes a llocs web externs, robar fitxes d'autenticació i controlar els detalls de pagament.
La forma més severa de vulnerabilitat XSS és el Cross-Site Scripting "emmagatzemat" o "persistent", aquí és on és possible que un atacant elabori una càrrega útil XSS i després l'enviï, de manera que es desa a la base de dades. Amb un exploit XSS desat a la base de dades, és possible que afecti altres usuaris durant un període de temps ampli.
Una altra forma de Cross-Site Scripting és "Reflected", aquest tipus no es desa en cap moment, sinó que la càrrega útil s'inclou al navegador. Normalment, aquest tipus de XSS forma part dels atacs de pesca, on un atacant intenta enganyar una víctima perquè faci clic en un enllaç maliciós.
Generalment, la majoria dels atacs XSS tenen la càrrega útil enviada al servidor en algun moment, però alguns atacs són purament del costat del client, mai s'envien al servidor i només afecten JavaScript del costat del client. Això s'anomena XSS basat en DOM, ja que es manté al model d'objectes de document de JavaScript o DOM. Aquest tipus de vulnerabilitat és especialment difícil d'identificar i resoldre perquè el servidor no veu mai els exploits i, per tant, no es poden registrar.
Històricament, la tècnica de prevenció contra les vulnerabilitats XSS és filtrar totes les dades enviades pels usuaris, utilitzant llistes de bloqueig per rebutjar qualsevol missatge amb caràcters o paraules significatius en JavaScript. Això va tendir a conduir a una carrera d'armaments per trobar bypasss per al filtre alhora que evitava alguns enviaments legítims dels usuaris. La solució correcta és utilitzar entitats HTML per codificar les dades enviades per l'usuari. amb els mòduls d'entitats HTML activats, els caràcters es codifiquen automàticament en un format on el navegador sap mostrar-los com els símbols correctes però no tractar-los com a codi.