Slovník pojmů
Content Security Policy
CSP omezuje, jaké zdroje smí prohlížeč na stránce načítat a spouštět. Je to obranná vrstva proti XSS, nikoli náhrada bezpečného výstupu a validace.
Stručná definice
Pravidla pro prohlížeč, ne oprava chyb na serveru.
Content Security Policy (CSP) je sada instrukcí, které server posílá prohlížeči nejčastěji v hlavičce Content-Security-Policy. Prohlížeč podle nich rozhoduje, zda smí dokument načíst nebo spustit konkrétní skript, styl, obrázek, font, iframe či spojení na API. Politika tak zmenšuje prostor, ve kterém může zneužití vloženého obsahu udělat škodu.
Nejčastěji se CSP používá jako defense in depth proti cross-site scriptingu. Správné escapování výstupu, bezpečné zacházení s HTML a kontrola vstupů zůstávají nutné: CSP je může omezit následky, ale neodstraňuje zranitelnost ani nečistí data. Zároveň může omezit vkládání stránky cizím webem nebo nechtěná spojení z prohlížeče.
Použití
Kde má politika konkrétní hranice
CSP má smysl tam, kde aplikace zná své vlastní zdroje a může jejich seznam průběžně ověřovat.
- PHP aplikace s vlastním JavaScriptem, CSS a obrázky na stejné doméně
- administrace, kde kompromitovaný inline skript může číst data uživatele
- e-shop s platebními, analytickými nebo chatovými integracemi z konkrétních domén
- frontend, který přes connect-src volá jen známá API
- postupné zpřísnění starší aplikace pomocí report-only režimu
Praktický příklad
Postupné zpřísnění administrace
Administrace nejprve odesílá report-only politiku a tým sleduje, které vlastní assety, CDN a integrační endpointy stránka skutečně používá. Inline onclick handlery se přesunou do JavaScriptu a jeden malý dynamický skript dostane nonce generovaný pro odpověď.
Po ověření kritických obrazovek se stejná politika přepne do vynuceného režimu. Hodnota nonce níže je pouze zástupný symbol: v aplikaci vzniká kryptograficky náhodně při každém response a propíše se do hlavičky i povoleného elementu.
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-{náhodná-hodnota-pro-response}';
style-src 'self';
img-src 'self' https://images.example-cdn.test;
connect-src 'self' https://api.example.test;
object-src 'none';
frame-ancestors 'self';
base-uri 'self'
Jak funguje
Od odpovědi serveru k rozhodnutí prohlížeče
Tok ukazuje jednoduchý diagram rozhodnutí, který prohlížeč provede pro každý chráněný zdroj.
- Server pošle hlavičku Například default-src nastaví výchozí zdroje a specializované direktivy doplní skripty, obrázky nebo spojení.
- Dokument žádá zdroj HTML, CSS nebo JavaScript chce načíst soubor, vložit iframe či zavolat externí API.
- Prohlížeč porovná pravidlo Použije konkrétní direktivu, například script-src nebo connect-src, případně fallback default-src.
- Zdroj povolí nebo zablokuje Povolený zdroj se načte; porušení se zablokuje v enforce režimu nebo jen nahlásí v report-only režimu.
- Tým ověří dopad Reporty, konzole prohlížeče a funkční testy pomohou doplnit legitimní zdroje bez otevření zbytečně široké výjimky.
Důležité pojmy
Direktivy mají mít úzký a vysvětlitelný účel.
Politika je čitelnější, když každá výjimka odpovídá skutečné části aplikace nebo integraci.
default-src a typy zdrojů
default-src je výchozí omezení. script-src, style-src, img-src, font-src a connect-src jej pro konkrétní typ zdroje zpřesňují. self znamená stejný origin, ne libovolnou bezpečnou doménu.
Nonce a hash
Nonce je nepředvídatelná hodnota nová pro každý relevantní response a prohlížeč ji porovná u povoleného skriptu nebo stylu. Hash se hodí pro neměnný známý inline obsah. Oba přístupy jsou přesnější než plošné unsafe-inline.
frame-ancestors a object-src
frame-ancestors řídí, kdo smí stránku vložit do rámce; object-src lze často zakázat hodnotou none. Jde o jiné hranice než načítání API nebo kontrola přihlášeného uživatele.
Report-only
Content-Security-Policy-Report-Only shromažďuje porušení, ale zdroj neblokuje. Slouží k ověření návrhu před vynucením, ne jako konečný bezpečnostní stav.
Vztah k podobným pojmům
CSP doplňuje jiné vrstvy ochrany.
Jednotlivé bezpečnostní mechanismy řeší jiné místo v toku webové aplikace.
- Escapování výstupu a XSS
- Escapování brání tomu, aby se data stala kódem. CSP omezuje, jaký kód či zdroj může prohlížeč spustit, pokud jiná ochrana selže.
- CSRF a CORS
- CSRF chrání akce provedené s cizí relací, CORS řídí čtení odpovědí mezi originy. CSP není náhradou ani jednoho z nich.
- nginx
- nginx může hlavičku předat, ale bezpečná politika musí znát šablony, assety a integrace konkrétní aplikace.
- API
- connect-src omezuje prohlížečová spojení na API. Neověřuje však oprávnění API klienta ani nenahrazuje serverovou autorizaci.
Výhody a omezení
Ochrana funguje jen tak přesně jako její pravidla.
Přínosy
- omezení nepovolených skriptů, zdrojů a některých XSS cest
- dohledatelné porušení při změně integrace nebo šablony
- možnost postupného zavedení přes report-only
- frame-ancestors jako samostatná ochrana proti nežádoucímu vložení stránky
Rizika a chyby
- unsafe-inline nebo široké wildcardy výrazně snižují hodnotu politiky
- statický nebo opakovaný nonce není bezpečný nonce
- povolení příliš důvěryhodné třetí strany může rozšířit útokovou plochu
- neotestovaná politika může rozbít platbu, administraci nebo načítání assetů
Hranice použití
Zpřísňovat po malých, měřitelných krocích.
Praktický postup začíná auditováním skriptů, stylů, CDN a integrací. Report-only režim ukáže legitimní porušení; pak lze převést inline handlery na posluchače událostí, nahradit inline skripty nonce nebo hashem a pravidla postupně vynutit. Politika se má testovat na kritických cestách, ne jen na domovské stránce.
CSP nenahrazuje bezpečný návrh šablon, CSRF ochranu, HTTPS ani autentizaci. U stránky s velkým množstvím starých inline skriptů může být první přínos už v omezení object-src a frame-ancestors, zatímco přísné script-src je realistické zavádět postupně. Cílem není co nejdelší hlavička, ale ověřitelné minimum zdrojů.
Na co myslet
Politika patří do testovaného provozního kontraktu.
Každá výjimka má mít důvod, vlastníka a kontrolu při změně aplikace nebo dodavatele.
- začít report-only hlavičkou a projít skutečná porušení
- pro skripty volit nonce nebo hash místo unsafe-inline
- nastavit object-src none a promyslet frame-ancestors
- omezit connect-src na známá API a testovat přihlášené i nepřihlášené cesty
- kontrolovat hlavičku v automatizovaných HTTP testech a po změně integrací
Časté otázky
Co CSP řeší v praxi
Nahradí CSP escapování výstupu?
Ne. Escapování a bezpečná práce s HTML zabraňují vzniku XSS. CSP přidává další vrstvu, která může omezit spuštění nebo načtení škodlivého obsahu.
Je report-only režim už ochranou?
Ne. Prohlížeč porušení jen hlásí. Je to bezpečný způsob, jak před vynucením zjistit dopad na legitimní funkce.
Mohu prostě povolit unsafe-inline?
Technicky ano, ale pro skripty tím mizí velká část ochrany. Lepší je postupně nahradit inline kód nonce, hashem nebo externím souborem.
Zajišťuje CSP, že API je autorizované?
Ne. connect-src omezuje prohlížečovou stránku, kam smí poslat request. API musí samostatně ověřit token, relaci a oprávnění na serveru.
Jak řeším bezpečnost v praxi
Bezpečnostní vrstvy posuzuji v kontextu celé aplikace.
Při návrhu a údržbě webu řeším hranice klienta, API, dat i provozní konfigurace společně.