Cross-site scripting vzniká, keď dáta určené na zobrazenie získajú v browseri význam kódu. Hodnota môže prísť z formulára, URL, databázy, externého API alebo dependency. Output encoding je silná obrana iba vtedy, keď zodpovedá presnému cieľu. HTML text, atribút, script, style a URL sú rozdielne gramatiky. Bezpečná architektúra udržuje používateľské hodnoty ako dáta a minimalizuje miesta, kde ich browser znovu parsuje.

Dokument obsahuje viac jazykov naraz

Text bezpečný medzi tagmi môže ukončiť JavaScript string. Hodnota uzavretá v atribúte môže stále vytvoriť javascript: URL. Každý prechod mení pravidlá.

Framework auto-escaping chráni bežné contexts, nie raw output, inline code, string concatenation a unsafe DOM API.

Escaping patrí na finálnu hranicu

HTML-encoded text v databáze mieša prezentáciu s dátami a zlyhá pri použití v JSON alebo inom kontexte. Často spôsobí double encoding.

Storage uchová semantic value, business vrstva validuje význam a renderer vyberie encoder podľa cieľa.

Nebezpečnému kontextu je lepšie sa vyhnúť

Untrusted text v event handleri, style alebo inline script-e sa zabezpečuje ťažko. Dáta možno preniesť ako JSON alebo bezpečný data attribute a čítať štruktúrovaným API.

DOM text sa vkladá cez textContent. innerHTML žiada browser, aby string interpretoval ako markup.

Rich text potrebuje sanitizer

Editor môže povoliť odkazy, zoznamy a zvýraznenie. Trusted sanitizer parsuje obsah a uplatní allowlist tagov, atribútov a schemes.

Výsledok má odlišný trusted HTML typ. Neskoré decode alebo concatenation môže ochranu zrušiť.

URL potrebuje policy aj attribute encoding

Escapované úvodzovky udržia value v href, no nezabránia dangerous scheme alebo open redirectu. URL sa najprv parsuje a validuje podľa povolených cieľov.

Až potom sa pri renderovaní aplikuje attribute encoder. Syntax a navigačná politika sú dve kontroly.

DOM-based XSS vzniká po serverovom renderi

Klientsky kód môže načítať fragment, storage alebo message event a vložiť hodnotu cez unsafe sink. Serverová šablóna už túto cestu neovplyvní.

Sources a sinks treba inventarizovať. Nebezpečné operácie sa odstránia alebo uzavrú za reviewovaný helper.

CSP obmedzuje dopad

Content Security Policy môže blokovať nečakaný inline script a obmedziť zdroje. Nonce alebo hash povolí schválený kód a reporting odhalí violations.

CSP je defense in depth. Legacy výnimky a chybná policy môžu ochranu oslabiť, preto encoding zostáva potrebný.

Trusted Types vynucujú hranicu

Trusted Types dokážu obmedziť code-capable DOM sinks na hodnoty vytvorené schválenou policy. Obyčajný string sa nedá náhodne vložiť ako HTML.

Migrácia môže začať report-only režimom. Policy stále potrebuje správny sanitizer, no počet neviditeľných unsafe miest sa zmenší.

Template raw helper je bezpečnostná udalosť

Každé vypnutie auto-escaping potrebuje dôvod, pôvod dát a test. Code review sa môže zamerať na malý počet takýchto miest.

Static analysis alebo code search zachytí nový raw sink pred nasadením. Výnimka bez vlastníka sa časom stáva zraniteľnosťou.

Test sleduje správanie browsera

Fixtures obsahujú úvodzovky, angle brackets, ampersand, dangerous schemes, malformed markup a Unicode edges. Nestačí hľadať substring v response.

Test overí DOM, properties atribútov a fakt, že sa nespustil nečakaný script. Zahŕňa aj klientské transformácie.

Third-party widget má rovnakú trust boundary

Knižnica, ktorá prijíma HTML string alebo template callback, môže obísť framework záruky. Jej API, sanitizer a update lifecycle patria do security review.

Externé skripty majú prístup k DOM a tokenom podľa browser modelu. CSP a subresource integrity môžu znížiť riziko, nie ho odstrániť.

Dáta musia zostať dátami

Contextual encoding funguje, pretože zachováva hranicu medzi hodnotou a programom. Sanitization je kontrolovaná výnimka a CSP ďalšia bariéra.

Jadrom ochrany nie je jedna escape funkcia. Je ním znalosť cieľového kontextu, bezpečné API a odstránenie miest, kde untrusted text môže získať vykonateľný význam.

CSP rollout potrebuje meranie, nie okamžité blokovanie

Existujúca aplikácia často používa inline scripts a third-party zdroje. Report-only policy najprv zbiera violations bez rozbitia stránky. Tím ich roztriedi na legitímne závislosti, nebezpečné legacy patterns a skutočné pokusy o injection.

Nonce sa generuje pre každú odpoveď a nesmie byť predvídateľný. Hash policy je vhodná pre stabilný inline script, ale každá zmena vyžaduje nový hash. Široké unsafe-inline alebo nekontrolované wildcard zdroje výrazne znižujú ochranu.

Hydration môže znovu otvoriť bezpečný serverový výstup

Server-side rendering môže escapovať text správne, no framework pri hydration načíta serialized state z dokumentu. Ak JSON nie je bezpečne vložený do script kontextu, sekvencia ukončujúca tag môže zmeniť štruktúru stránky.

Framework má používať určený serializer pre embedded state a ideálne externý JSON endpoint. Ručné JSON.stringify vložené do template nie je automaticky bezpečné pre HTML parser.

Mutation XSS využíva zmenu pri opätovnom parsovaní

Sanitizovaný markup môže browser po vložení do DOM preusporiadať. Neskoršia serializácia a opätovné vloženie cez innerHTML môže vytvoriť inú štruktúru, než sanitizer pôvodne kontroloval. Moderné knižnice testujú také parserové premeny.

Aplikácia nemá zbytočne reserializovať trusted DOM do stringu a znovu ho parsovať. Structured DOM operations zachovávajú jasnejšiu hranicu a znižujú priestor pre mutation správanie.

Incident response potrebuje zoznam sinks

Keď sa objaví XSS v jednej komponentne, tím musí vedieť nájsť ďalšie použitia rovnakého raw helpera, sanitizer policy alebo third-party widgetu. Centrálna evidencia nebezpečných sinks a static query urýchlia rozsah incidentu.

Oprava zahŕňa odstránenie payloadu z uložených dát, update policy, invalidáciu cache a podľa rizika zrušenie sessions. Zablokovať iba jeden známy string nevyrieši triedu zraniteľnosti.