Cross-site scripting (XSS) is een aanval waarbij iemand kwaadaardige code, meestal JavaScript, in een webpagina smokkelt zodat die draait in de browser van iedereen die de pagina bekijkt. Omdat de code draait met hetzelfde vertrouwen als je echte site, kan hij meelezen wat gebruikers typen, hun inlogsessie kapen of ze naar iets schadelijks sturen. De bezoeker ziet het niet gebeuren.
Een typisch voorbeeld: een reactieveld dat zijn invoer niet opschoont. Een aanvaller plaatst een reactie met een verborgen script in plaats van tekst. Elke latere bezoeker die die reactie laadt, draait het script onbewust in zijn eigen browser. Het lijkt een beetje op een vervalst briefje achterlaten op een vertrouwd prikbord, waar iedereen die het bord leest ernaar handelt. XSS staat om precies die reden hoog in de OWASP Top 10.
Die opgeslagen variant is het schadelijkst, maar er bestaat ook een gereflecteerde vorm, waarbij de kwaadaardige code meelift in een geprepareerde link en afgaat zodra een slachtoffer erop klikt. Beide hebben dezelfde kern: data die de site van buiten kreeg, wordt uiteindelijk als code behandeld. De verdediging is om alle gebruikersinvoer als onbetrouwbaar te behandelen: escape of schoon alles op voordat het op een pagina komt, zodat een script onschuldige tekst wordt. Een Content Security Policy voegt een sterke tweede laag toe door de browser elk script te laten weigeren dat de site niet expliciet heeft goedgekeurd.
Een veelgemaakte fout is escapen op de ene plek maar niet op de andere. Tekst die veilig is in een alinea kan alsnog uitbreken als hij in een HTML-attribuut of een URL belandt, dus de manier van escapen moet passen bij waar de waarde terechtkomt.
Bij TopDevs escapen we uitvoer standaard en leveren we een afgestemde Content Security Policy op de apps die we bouwen, zodat geïnjecteerde scripts geen ruimte hebben om te draaien.