Co je CSP a jak chrání webové stránky?
Autor: Redakce Domeny.ForSale Zveřejněno
Stručně: CSP neboli Content Security Policy je bezpečnostní mechanismus prohlížeče, který umožňuje určit, odkud smí stránka načítat zdroje a jaký kód smí spouštět. Pomáhá omezovat následky XSS, tedy vložení cizího skriptu do stránky, a vhodná direktiva chrání také před vkládáním webu do nežádoucích rámců. Politiku je nejlepší předávat v hlavičce odpovědi HTTP a nejprve ji otestovat bez blokování zdrojů.
Jak CSP funguje a před čím chrání?
Prohlížeč běžně načítá zdroje uvedené v kódu stránky: skripty, soubory stylů, obrázky či písma. CSP k tomu přidává sadu pravidel. Pokud zdroj nebo způsob spuštění kódu nevyhovuje politice, prohlížeč jej zablokuje a zaznamená informaci o porušení pravidel ve vývojářských nástrojích.
Nejdůležitějším využitím CSP je omezování útoků XSS (cross-site scripting). Při takovém útoku útočník dosáhne spuštění svého skriptu v kontextu cizího webu. Například chyba ve formuláři pro komentáře může umožnit vložení kódu v jazyce JavaScript místo běžného textu. Dostatečně přísná CSP může spuštění tohoto kódu zabránit, i když jej aplikace chybně vloží na stránku.
CSP pomáhá také bránit clickjackingu: vložení stránky do rámce a přimění uživatele, aby klikal na její prvky skryté pod klamavou překryvnou vrstvou. Tuto ochranu zajišťuje direktiva frame-ancestors. Samotné nastavení pravidel pro skripty ji neposkytuje.
CSP však neopravuje bezpečnostní chyby aplikace. Stále je nutné správně kódovat výstupní data, bezpečně zpracovávat uživatelský obsah a aktualizovat software. Politika je další vrstvou ochrany, nikoli náhradou těchto opatření.
Kde se politika CSP nastavuje?
Doporučeným místem je hlavička odpovědi HTTP s názvem Content-Security-Policy. Přidávat ji může aplikace, webový server, reverzní proxy nebo CDN. Hlavička má do prohlížeče dorazit společně s dokumentem HTML, na který se má vztahovat.
Část pravidel lze předat také pomocí značky meta s atributem http-equiv="Content-Security-Policy". Toto řešení má omezení: politika začne platit až po načtení značky a nepodporuje režim hlášení bez blokování ani direktivu frame-ancestors. Pokud máte přístup ke konfiguraci odpovědí HTTP, zvolte hlavičku.
Ověřte také, zda CSP již nepřidává jiná vrstva infrastruktury. Více politik se uplatňuje současně — další hlavička automaticky nenahrazuje předchozí. Může tak fungování stránky ještě více omezit.
Nejdůležitější direktivy a příklad hlavičky
Direktiva je jednotlivé pravidlo politiky. Direktivy se oddělují středníky a za jejich názvy se uvádějí povolené zdroje nebo zvláštní hodnoty.
| Direktiva | Co řídí |
|---|---|
default-src | Výchozí zdroje pro řadu typů prostředků, pokud nemají vlastní pravidlo |
script-src | Zdroje skriptů a podmínky spouštění kódu v jazyce JavaScript |
style-src | Zdroje souborů stylů a pravidla používání vložených stylů |
img-src | Zdroje obrázků |
connect-src | Spojení navazovaná mimo jiné pomocí fetch a WebSocket |
object-src | Vložené objekty obsluhované prvky, jako je object |
base-uri | Adresy povolené v prvku base |
frame-ancestors | Stránky, které smějí dokument vkládat do rámce |
Pro jednoduchý web využívající pouze vlastní soubory může jako výchozí nastavení posloužit:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
Hodnota 'self' označuje stejný původ: shodné schéma, název hostitele a port. 'none' nepovoluje žádný zdroj. Uvedený příklad zakazuje vkládání stránky do rámců a blokuje mimo jiné skripty zapsané přímo v HTML a atributy událostí, například onclick.
Nejde o univerzální konfiguraci. Pokud stránka používá externí platební systém, analytiku nebo písma, je třeba zjistit potřebné zdroje a přidat je do příslušných direktiv. default-src nenahrazuje všechna pravidla — například frame-ancestors vyžaduje samostatnou deklaraci.
Jak nasadit CSP bez nechtěného blokování stránky?
Nejbezpečnější je nejprve zjistit, na čem web skutečně závisí, a teprve potom zapnout blokování.
- Sepište zdroje a integrace. Zahrňte nejen hlavní stránku, ale také přihlašování, formuláře, platby a uživatelskou sekci.
- Nastavte hlavičku
Content-Security-Policy-Report-Only. Prohlížeč vyhodnotí navrženou politiku a nahlásí její porušení, ale příslušné zdroje ani operace nezablokuje. Automatický sběr hlášení vyžaduje další konfiguraci mechanismu hlášení a místa pro jejich příjem. - Otestujte celé uživatelské scénáře. Zkontrolujte konzoli a panel síťových požadavků prohlížeče. Odlište potřebné zdroje od zbytečných integrací a požadavků pocházejících z rozšíření prohlížeče.
- Upravte pravidla a kód. Po testech přepněte ověřenou politiku na
Content-Security-Policya po nasazení sledujte chyby.
Nezbavujte se varování bezmyšlenkovitým přidáváním *, 'unsafe-inline' nebo 'unsafe-eval'. Takové výjimky mohou ochranu výrazně oslabit. Pro potřebné vložené skripty lze použít nonce — nepředvídatelnou hodnotu generovanou pro každou odpověď — nebo hash, tedy otisk obsahu konkrétního skriptu. Nonce se musí shodovat v hlavičce a v prvku skriptu; pevná hodnota vložená do konfigurace tento účel nesplňuje.
Začněte s politikou v režimu hlášení v testovacím prostředí a projděte celou cestu od otevření stránky až po odeslání formuláře nebo dokončení nákupu. Zjistíte tak, jaká oprávnění jsou skutečně potřeba, ještě než CSP začne uživatelům blokovat zdroje.
