Co je CSP a jak chrání webové stránky?

Autor: 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.

DirektivaCo řídí
default-srcVýchozí zdroje pro řadu typů prostředků, pokud nemají vlastní pravidlo
script-srcZdroje skriptů a podmínky spouštění kódu v jazyce JavaScript
style-srcZdroje souborů stylů a pravidla používání vložených stylů
img-srcZdroje obrázků
connect-srcSpojení navazovaná mimo jiné pomocí fetch a WebSocket
object-srcVložené objekty obsluhované prvky, jako je object
base-uriAdresy povolené v prvku base
frame-ancestorsStrá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í.

  1. Sepište zdroje a integrace. Zahrňte nejen hlavní stránku, ale také přihlašování, formuláře, platby a uživatelskou sekci.
  2. 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.
  3. 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.
  4. Upravte pravidla a kód. Po testech přepněte ověřenou politiku na Content-Security-Policy a 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.

Přečtěte si také

Zjistěte, jak PHP-FPM zpracovává požadavky PHP, čím se liší od webového serveru a jak nastavit procesy podle provozu a zdrojů hostingu.
Poznejte BIND, otevřený software pro server DNS: jak spravuje domény, jaké role plní a kdy se vyplatí provozovat vlastní server.
Zjistěte, k čemu slouží polský registr a číslo REGON, jak se liší od NIP a KRS a jak v oficiálním registru ověřit údaje o firmě.