Naučte se, jak Content Security Policy (CSP) účinně zmírňuje útoky Cross-Site Scripting (XSS) a zlepšuje zabezpečení webu pro globální publikum.
Content Security Policy (CSP): Komplexní průvodce prevencí XSS
V dnešním digitálním prostředí je zabezpečení webu prvořadé. Útoky Cross-Site Scripting (XSS) zůstávají rozšířenou a nebezpečnou hrozbou pro webové aplikace po celém světě. Content Security Policy (CSP) je výkonná hlavička HTTP odpovědi, která poskytuje další vrstvu zabezpečení a pomáhá zmírnit riziko zranitelností XSS. Tato příručka nabízí komplexní přehled CSP, její implementaci a osvědčené postupy pro ochranu vašich webových aplikací před útoky XSS.
Co je Cross-Site Scripting (XSS)?
Cross-Site Scripting (XSS) je typ injekčního útoku, při kterém jsou škodlivé skripty vkládány do jinak neškodných a důvěryhodných webových stránek. Útoky XSS nastávají, když útočník použije webovou aplikaci k odeslání škodlivého kódu, obvykle ve formě skriptu na straně prohlížeče, jinému koncovému uživateli. Chyby, které umožňují úspěch těchto útoků, jsou poměrně rozšířené a vyskytují se všude tam, kde webová aplikace používá vstup od uživatele ve výstupu, který generuje, bez jeho validace nebo kódování.
Existují tři hlavní typy útoků XSS:
- Stored (Persistent) XSS: Škodlivý skript je trvale uložen na cílovém serveru (např. v databázi, diskusním fóru, logu návštěvníků, poli pro komentáře atd.). Když uživatel navštíví postiženou stránku, uložený skript se spustí.
- Reflected (Non-Persistent) XSS: Škodlivý skript je reflektován z webového serveru, například v chybové zprávě, výsledku vyhledávání nebo jakékoli jiné odpovědi, která obsahuje část nebo celý vstup odeslaný na server jako součást požadavku. Uživatel musí být oklamán, aby klikl na škodlivý odkaz nebo odeslal formulář obsahující škodlivý skript.
- DOM-based XSS: Zranitelnost spočívá v samotném kódu na straně klienta. Škodlivý skript se spustí, protože prostředí DOM prohlížeče je manipulováno tak, aby obsahovalo skript útočníka.
Útoky XSS mohou mít vážné následky, včetně:
- Krádeže uživatelských přihlašovacích údajů (cookies, session tokenů).
- Defacementu webových stránek.
- Přesměrování uživatelů na škodlivé stránky.
- Instalace malwaru.
- Získání neoprávněného přístupu k citlivým datům.
Co je Content Security Policy (CSP)?
Content Security Policy (CSP) je přidaná vrstva zabezpečení, která pomáhá detekovat a zmírňovat určité typy útoků, včetně útoků Cross-Site Scripting (XSS) a útoků vkládáním dat. CSP je implementována pomocí hlavičky HTTP odpovědi, která vám umožňuje řídit zdroje (např. skripty, styly, obrázky, fonty, rámce), které prohlížeč smí načíst pro konkrétní stránku. Defináním přísné CSP můžete výrazně snížit útočnou plochu vaší webové aplikace a ztížit útočníkům vkládání škodlivého kódu.
CSP funguje definováním bílé listiny zdrojů, ze kterých prohlížeč smí načítat zdroje. Jakýkoli zdroj načtený ze zdroje, který není výslovně povolen v CSP, bude prohlížečem zablokován. Tím se zabrání spouštění neautorizovaných skriptů a sníží se riziko útoků XSS.
Jak CSP funguje: Direktivy a zdroje
CSP se konfiguruje pomocí sady direktiv, z nichž každá určuje politiku pro konkrétní typ zdroje. Každá direktiva se skládá z názvu následovaného seznamem povolených zdrojů. Zde jsou některé z nejčastěji používaných direktiv CSP:
- `default-src`: Určuje výchozí politiku pro načítání zdrojů, pokud nejsou přítomny jiné direktivy specifické pro zdroje.
- `script-src`: Určuje povolené zdroje pro kód JavaScript.
- `style-src`: Určuje povolené zdroje pro styly (CSS).
- `img-src`: Určuje povolené zdroje pro obrázky.
- `font-src`: Určuje povolené zdroje pro fonty.
- `connect-src`: Určuje povolené zdroje pro provádění síťových požadavků (např. AJAX, WebSockets).
- `media-src`: Určuje povolené zdroje pro načítání video a audio zdrojů.
- `object-src`: Určuje povolené zdroje pro pluginy, jako je Flash.
- `frame-src`: Určuje povolené zdroje pro vkládání rámců (iframes).
- `base-uri`: Omezuje URL adresy, které lze použít v prvku <base> dokumentu.
- `form-action`: Omezuje URL adresy, na které lze odesílat formuláře.
- `upgrade-insecure-requests`: Instrukce pro prohlížeče, aby automaticky upgradovaly nebezpečné (HTTP) požadavky na bezpečné (HTTPS) požadavky.
- `block-all-mixed-content`: Zabraňuje prohlížeči načítat jakékoli zdroje pomocí HTTP, když je stránka načtena přes HTTPS.
- `report-uri`: Určuje URL, na kterou by měl prohlížeč odesílat zprávy o porušení CSP. Deprecováno ve prospěch `report-to`.
- `report-to`: Určuje pojmenovaný koncový bod, na který by měl prohlížeč odesílat zprávy o porušení CSP.
Běžně používané hodnoty zdrojů zahrnují:
- `*`: Povoluje zdroje z jakéhokoli zdroje (nedoporučeno pro produkční prostředí).
- `'self'`: Povoluje zdroje ze stejného původu (schéma, hostitel a port) jako chráněný dokument.
- `'none'`: Zakazuje načítání zdrojů z jakéhokoli zdroje.
- `data:`: Povoluje načítání zdrojů prostřednictvím schématu `data:` (např. inline obrázky).
- `'unsafe-inline'`: Povoluje použití inline skriptů a stylů CSS (silně se nedoporučuje).
- `'unsafe-eval'`: Povoluje použití `eval()` a podobných funkcí (silně se nedoporučuje).
- `'strict-dynamic'`: Určuje, že důvěra explicitně udělená skriptu přítomnému v markup, doprovázená nonce nebo hash, bude propagována na všechny skripty načtené tímto kořenovým skriptem.
- `'nonce-
'` : Povoluje skripty nebo styly s odpovídajícím atributem nonce. - `'sha256-
'`, `'sha384- : Povoluje skripty nebo styly s odpovídajícím SHA hashem.'`, `'sha512- '` - `https://example.com`: Povoluje zdroje z konkrétní domény.
Implementace CSP
CSP lze implementovat dvěma hlavními způsoby:
- HTTP hlavička: Preferovaný způsob je nakonfigurovat váš webový server tak, aby odesílal HTTP hlavičku `Content-Security-Policy`. To vám umožní definovat CSP pro každou stránku nebo zdroj na vašem webu.
- <meta> značka: CSP lze také definovat pomocí <meta> značky v sekci <head> vašeho HTML dokumentu. Tato metoda je však méně flexibilní a má omezení ve srovnání s použitím HTTP hlavičky. Například direktivy `frame-ancestors`, `sandbox` a `report-uri` nelze použít v HTML meta značkách.
Použití HTTP hlavičky
Chcete-li implementovat CSP pomocí HTTP hlavičky, musíte nakonfigurovat svůj webový server tak, aby zahrnoval hlavičku `Content-Security-Policy` ve svých odpovědích. Konkrétní kroky konfigurace se budou lišit v závislosti na použitém webovém serveru.
Zde jsou příklady pro běžné webové servery:
- Apache: Přidejte následující řádek do souboru `.htaccess` nebo do konfigurace virtuálního hostitele:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;"
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:";
app.use(function(req, res, next) {
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;");
next();
});
Použití <meta> značky
Chcete-li implementovat CSP pomocí <meta> značky, přidejte následující značku do sekce <head> vašeho HTML dokumentu:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;">
Důležité úvahy:
- Atribut `http-equiv` musí být nastaven na "Content-Security-Policy".
- Atribut `content` obsahuje direktivy CSP.
- Pamatujte na omezení použití <meta> značek, jak bylo zmíněno dříve.
Příklady CSP
Zde je několik příkladů CSP s vysvětlením:
- Základní CSP:
- Povolení skriptů z konkrétní domény:
- Povolení stylů z CDN:
- Povolení obrázků z jakéhokoli zdroje:
- Hlášení o porušení CSP:
- Použití `report-to` a `report-uri` společně pro kompatibilitu:
- Použití Nonce pro inline skripty:
Content-Security-Policy: default-src 'self';
Tato politika povoluje pouze zdroje ze stejného původu.
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com;
Tato politika povoluje zdroje ze stejného původu a skripty z `https://example.com`.
Content-Security-Policy: default-src 'self'; style-src 'self' https://cdn.example.com;
Tato politika povoluje zdroje ze stejného původu a styly z `https://cdn.example.com`.
Content-Security-Policy: default-src 'self'; img-src *;
Tato politika povoluje zdroje ze stejného původu a obrázky z jakéhokoli zdroje (nedoporučeno pro produkci).
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint;
Tato politika povoluje zdroje ze stejného původu a odesílá zprávy o porušení na `/csp-report-endpoint`. Doporučuje se použít `report-to` místo `report-uri`.
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"/csp-report-endpoint"}]}
Tento příklad ukazuje nastavení koncového bodu `report-uri` (pro starší prohlížeče) a `report-to`, spolu s konfigurací samotné hlavičky `Report-To`. Ujistěte se, že váš server správně zpracovává hlavičku `Report-To`, nastavuje správně `group`, `max_age` a `endpoints`.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-rAnd0mN0nc3Str1nG';
Tato politika povoluje zdroje ze stejného původu a inline skripty s odpovídajícím atributem nonce.
<script nonce="rAnd0mN0nc3Str1nG">
// Váš kód inline skriptu zde
</script>
CSP v režimu pouze pro hlášení
CSP lze implementovat ve dvou režimech:
- Režim vynucení: Prohlížeč blokuje zdroje, které porušují CSP.
- Režim pouze pro hlášení: Prohlížeč hlásí porušení CSP na zadaný koncový bod, aniž by blokoval jakékoli zdroje.
Režim pouze pro hlášení je užitečný pro testování a ladění vaší CSP před jejím vynucením. Pro povolení režimu pouze pro hlášení použijte hlavičku HTTP `Content-Security-Policy-Report-Only` místo hlavičky `Content-Security-Policy`.
Příklad:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint;
Tato konfigurace odešle zprávy na `/csp-report-endpoint` bez blokování jakýchkoli zdrojů.
Osvědčené postupy pro implementaci CSP
Zde jsou některé osvědčené postupy pro efektivní implementaci CSP:
- Začněte s přísnou politikou: Začněte s restriktivní politikou, která povoluje zdroje pouze ze stejného původu, a postupně ji uvolňujte podle potřeby.
- Používejte Nonce nebo Hashe pro inline skripty a styly: Vyhněte se používání `'unsafe-inline'` a používejte noncy nebo hashe pro povolení konkrétních inline skriptů a stylů.
- Vyhněte se `'unsafe-eval'`: Pokud je to možné, vyhněte se používání `'unsafe-eval'`, protože může představovat bezpečnostní rizika. Zvažte alternativní přístupy pro dynamické provádění kódu.
- Používejte HTTPS: Zajistěte, aby byly všechny zdroje načítány přes HTTPS, aby se zabránilo útokům typu man-in-the-middle. Použijte direktivu `upgrade-insecure-requests` k automatickému upgradu nebezpečných požadavků.
- Monitorujte porušení CSP: Nastavte koncový bod pro hlášení, abyste mohli monitorovat porušení CSP a identifikovat potenciální bezpečnostní problémy.
- Důkladně otestujte svou CSP: Otestujte svou CSP v různých prohlížečích a prostředích, abyste zajistili, že funguje podle očekávání.
- Iterujte a vylepšujte: Implementace CSP je iterativní proces. Neustále monitorujte a vylepšujte svou CSP, jak se vaše aplikace vyvíjí.
- Zvažte direktivu `strict-dynamic`: Použijte `strict-dynamic` ke snížení složitosti vaší CSP propagací důvěry na skripty načtené důvěryhodnými skripty.
Nástroje pro CSP
Několik nástrojů vám může pomoci generovat, testovat a monitorovat CSP:
- Generátory CSP: Online nástroje, které generují CSP direktivy na základě zdrojů vašeho webu.
- Nástroje pro vývojáře prohlížečů: Většina moderních prohlížečů poskytuje nástroje pro vývojáře, které vám mohou pomoci analyzovat porušení CSP.
- Služby monitorování CSP: Služby, které shromažďují a analyzují zprávy o porušení CSP.
CSP a frameworky/knihovny
Při používání frameworků a knihoven je důležité správně nakonfigurovat CSP, abyste zajistili kompatibilitu a předešli bezpečnostním problémům. Zde jsou některé úvahy:
- JavaScript frameworky (např. React, Angular, Vue.js): Tyto frameworky často používají inline styly nebo generování dynamického kódu, což může vyžadovat speciální konfiguraci CSP (např. noncy, hashe, `'unsafe-eval'`).
- CSS frameworky (např. Bootstrap, Tailwind CSS): Tyto frameworky mohou používat inline styly nebo externí styly, které musí být povoleny ve vaší CSP.
- Knihovny třetích stran: Zajistěte, aby byly všechny knihovny třetích stran, které používáte, kompatibilní s vaší CSP a nezaváděly bezpečnostní zranitelnosti.
CSP a CDN (Content Delivery Networks)
CDN se běžně používají k hostování statických prostředků, jako jsou soubory JavaScript, styly CSS a obrázky. Chcete-li povolit zdroje z CDN ve vaší CSP, musíte explicitně přidat domény CDN na bílou listinu.
Příklad:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' https://cdnjs.cloudflare.com;
Tato politika povoluje skripty z jsDelivr a styly z cdnjs od Cloudflare.
Běžné chyby CSP, kterým je třeba se vyhnout
Zde jsou některé běžné chyby CSP, kterým je třeba se vyhnout:
- Použití `*` jako zdroje: Povolení zdrojů z jakéhokoli zdroje může znehodnotit výhody CSP.
- Použití `'unsafe-inline'` a `'unsafe-eval'` bez ospravedlnění: Tyto direktivy mohou zavádět bezpečnostní rizika a měly by být, pokud je to možné, zváženy.
- Nesledování porušení CSP: Neschopnost monitorovat porušení CSP může zabránit identifikaci a řešení bezpečnostních problémů.
- Nedostatečné testování CSP: Nedostatečné testování může vést k neočekávanému chování a bezpečnostním zranitelnostem.
- Nesprávná konfigurace Nonce a Hashů: Nesprávně nakonfigurované noncy a hashe mohou zabránit načítání legitimních skriptů a stylů.
Pokročilé koncepty CSP
Kromě základů může několik pokročilých konceptů CSP dále zvýšit vaše zabezpečení webu:
- Direktiva `frame-ancestors`: Určuje povolené rodiče, kteří mohou vložit rámec (iframe) do vaší stránky. Chrání před útoky typu clickjacking.
- Direktiva `sandbox`: Povoluje sandbox pro požadovaný zdroj, přičemž platí omezení jeho schopností (např. zabránění spouštění skriptů, odesílání formulářů).
- Direktiva `require-sri-for`: Vyžaduje Subresource Integrity (SRI) pro skripty nebo styly načtené z externích zdrojů. SRI zajišťuje, že soubory nebyly pozměněny.
- Trusted Types API: Pomáhá předcházet DOM-based XSS vynucením typové bezpečnosti na DOM «sinky».
Budoucnost CSP
CSP se neustále vyvíjí, aby řešila nové bezpečnostní výzvy. Budoucí vývoj může zahrnovat:
- Zlepšená podpora prohlížečů: Pokračující zlepšení podpory prohlížečů pro funkce CSP.
- Nové direktivy a funkce: Zavádění nových direktiv a funkcí pro řešení vznikajících bezpečnostních hrozeb.
- Integrace s bezpečnostními nástroji: Hlubší integrace s bezpečnostními nástroji a platformami pro automatizaci správy a monitorování CSP.
Závěr
Content Security Policy (CSP) je mocný nástroj pro zmírňování útoků XSS a zlepšení zabezpečení webu. Definování přísné CSP můžete výrazně snížit útočnou plochu vaší webové aplikace a ochránit vaše uživatele před škodlivým kódem. Efektivní implementace CSP vyžaduje pečlivé plánování, důkladné testování a neustálé monitorování. Dodržováním osvědčených postupů uvedených v této příručce můžete využít CSP ke zlepšení bezpečnostního postavení svých webových aplikací a zabezpečit svou online přítomnost v globálním digitálním ekosystému.
Nezapomeňte pravidelně kontrolovat a aktualizovat svou CSP, abyste se přizpůsobili vyvíjejícím se bezpečnostním hrozbám a zajistili, že vaše webové aplikace zůstanou chráněny.