Zkratka proCross-Site ScriptingTakéCross-Site Scripting, Cross-site scripting, stored XSS, reflected XSS, DOM-based XSSPokročilý
Definice
XSS je zranitelnost webové aplikace, při které se útočníkovi podaří dostat vlastní JavaScript do stránky zobrazené jinému uživateli. Prohlížeč pak skript spustí v důvěryhodném kontextu napadeného webu, takže může číst obsah stránky, zneužít relaci, měnit formuláře nebo odesílat akce jménem oběti.
Proč prohlížeč bere vložený skript vážně
XSS vzniká ve chvíli, kdy aplikace smíchá nedůvěryhodný vstup s HTML, JavaScriptem nebo daty pro prohlížeč tak, že vstup přestane být obyčejným textem. Prohlížeč nepozná úmysl vývojáře. Pokud stránka obsahuje platný skript, událostní atribut nebo nebezpečně složený fragment DOM, prohlížeč kód spustí jako součást stejného webu.
Důležitý dopad plyne z kontextu původu stránky. Skript vložený přes XSS běží s oprávněními webu, který uživatel otevřel. Může číst části dokumentu, volat API dostupná z prohlížeče, měnit formuláře a odesílat požadavky. Pokud aplikace ukládá citlivé hodnoty do čitelné cookie nebo do webového úložiště, riziko roste.
Kde se XSS v aplikaci nejčastěji rodí
Reflected XSS se vrací okamžitě v odpovědi serveru, typicky ve výsledku hledání nebo chybové hlášce. Stored XSS se uloží do databáze a zasáhne další uživatele, například při zobrazení komentáře. DOM-based XSS vzniká hlavně v klientském kódu, který nebezpečně zapisuje hodnoty z URL, zpráv nebo API do stránky.
Jedna ochrana nestačí pro všechny kontexty. Text mezi HTML značkami, hodnota atributu, řetězec v JavaScriptu a URL mají odlišná pravidla escapování. Bezpečný výstup proto musí respektovat konkrétní místo, kam se data vkládají. Sanitizace je vhodná pro omezené HTML od uživatelů, ne jako univerzální náhrada za správné kódování výstupu.
Dva praktické scénáře
Komentář s uloženým skriptem
Diskusní aplikace uloží komentář bez úprav a administrace ho později vykreslí přes HTML. Útočníkův text se nezobrazí jako text, ale spustí se při otevření seznamu komentářů. Správné řešení je ukládat obsah jako data a při výpisu ho kódovat podle HTML kontextu.
<div>Ahoj <script>fetch('/api/me').then(r => r.text()).then(sendAway)</script></div>Vyhledávání s odraženým parametrem
Stránka s vyhledáváním vloží parametr z adresy přímo do výsledku. Odkaz poslaný oběti pak může obsahovat vstup, který změní strukturu stránky. Bezpečnější varianta zapisuje hodnotu jako textový uzel, ne jako HTML.
const q = new URLSearchParams(location.search).get('q') ?? '';
result.innerHTML = `Hledali jste: ${q}`; // špatně
result.textContent = `Hledali jste: ${q}`; // bezpečnějšíObrana, která drží i při růstu projektu
Základem je automatické escapování ve frameworku, šablonách nebo komponentách, zákaz nebezpečných API bez revize a jasná pravidla pro práci s uživatelským HTML. Content Security Policy omezuje následky a pomáhá odhalovat chyby, ale neopraví špatné skládání stránky. Citlivé relační hodnoty patří do HttpOnly cookies a bezpečnostní rozhodnutí nesmí stát na tokenu čitelném libovolným skriptem.
Příklady z praxe
Komentář s uloženým skriptem
Diskusní aplikace uloží komentář bez úprav a administrace ho později vykreslí přes HTML. Útočníkův text se nezobrazí jako text, ale spustí se při otevření seznamu komentářů. Výsledkem může být čtení dat dostupných administrátorovi nebo odeslání akcí jeho jménem.
<div>Ahoj <script>fetch('/api/me').then(r => r.text()).then(sendAway)</script></div>Vyhledávání s odraženým parametrem
Stránka s vyhledáváním vloží parametr z adresy přímo do výsledku. Odkaz poslaný oběti pak může obsahovat vstup, který změní strukturu stránky. Bezpečnější varianta zapisuje hodnotu jako textový uzel, takže prohlížeč neinterpretuje vstup jako značky ani skript.
const q = new URLSearchParams(location.search).get('q') ?? ''; result.innerHTML = `Hledali jste: ${q}`; // špatně result.textContent = `Hledali jste: ${q}`; // bezpečnější
Časté omyly
- MýtusXSS se vyřeší tím, že zakážeme znak <.
- Ve skutečnostiXSS nevzniká jen přes HTML značku script. Nebezpečný vstup se může objevit v atributu, URL, JavaScriptovém řetězci, CSS kontextu nebo v DOM operaci, takže obrana musí odpovídat konkrétnímu kontextu.
- MýtusHTTPS zabrání XSS útoku.
- Ve skutečnostiHTTPS chrání přenos mezi prohlížečem a serverem, ne logiku vykreslení stránky. XSS může běžet i na perfektně šifrovaném webu, pokud aplikace vloží nedůvěryhodná data jako spustitelný obsah.
- MýtusPoužíváme React, takže XSS nehrozí.
- Ve skutečnostiReact a podobné frameworky běžně escapují textové hodnoty, což výrazně pomáhá. XSS se ale může vrátit přes nebezpečné API, špatně sanitizované HTML, nezabezpečené externí skripty nebo ruční manipulaci s DOM.
Časté dotazy
- Proč je XSS nebezpečné i v interní administraci?
- XSS se řeší i u interních administrací, protože administrátor mívá širší oprávnění než běžný uživatel. Uložený škodlivý komentář, název objednávky nebo pole profilu se může spustit právě při kontrole v administraci. Útočník pak neútočí přímo na databázi, ale na prohlížeč člověka, který má přístup k citlivým akcím.
- Stačí proti XSS zapnout Content Security Policy?
- Content Security Policy je silná doplňková ochrana proti XSS, ale sama o sobě problém neřeší. CSP může zakázat inline skripty, omezit zdroje JavaScriptu a ztížit odnesení dat, jenže špatně vložený HTML obsah zůstává chybou aplikace. Primární obrana je správné kódování výstupu, bezpečné šablony a omezené zacházení s uživatelským HTML.
- Jak bezpečně zobrazit HTML napsané uživatelem?
- Aplikace má HTML od uživatele zobrazovat jen tehdy, když je jasně omezené a prošlo sanitizací určenou pro HTML. Sanitizace musí povolit pouze bezpečné značky a atributy, odstranit skripty, nebezpečné URL a událostní atributy. Pokud uživatel nepotřebuje formátování, lepší řešení je zobrazit vstup jako obyčejný text pomocí automatického escapování.
- Kdy má XSS největší dopad na uživatele?
- XSS je zvlášť vážné, když napadená stránka pracuje s účtem přihlášeného uživatele, administrátorskými funkcemi nebo citlivými daty v prohlížeči. Škodlivý skript pak může využít existující relaci a provést akce, které server považuje za legitimní. Riziko zvyšují čitelné tokeny, slabá kontrola oprávnění a chybějící potvrzení důležitých operací.
Zdroje
- Cross Site Scripting (XSS)(otevře se v novém okně)
- OWASP Cheat Sheet Series(otevře se v novém okně)
- Cross-site scripting (XSS)(otevře se v novém okně)
- Content Security Policy (CSP)(otevře se v novém okně)