Content Security Policy (CSP)

Content Security Policy

Politika „načítání“ zdrojů, nebo-li nastavení whitelistingu zdrojů.

Content Security Policy je hlavička, která prohlížeči říká co vše za soubory může do stránek nahrát a jak. Použitím CSP lze zabránit, aby byly do stránek vkládány škodlivé funkce. Nastavení lze atomizovat až na jednotlivé typy souborů (obrázky, skripty, styly, fonty, média), může se nařídit pouze načítání přes https protokol nebo pouze z vlastní domény. CSP hlavička může být poměrně obsáhlá a pokud načítaný obsah nevyhovuje jejím pravidlům, není načten a prohlížeč do své konzole vypíše chybovou zprávu.
U složitějších webů nasazení hlavičky Content-Security-Policy není zcela triviální a vyžaduje přesnou analýzu načítaného obsahu a nastavení správných pravidel.

Proč používat CSP

Content Security Policy je velice užitečná hlavička ochrany proti XSS útokům a vkládání zákeřného kódu útočícího na uživatele. Určuje povolené URL, ze kterých může prohlížeč do stránky stahovat JavaScript, CSS, obrázky a další zdroje. Dobře nastavená pravidla pomohou vývojářům ochránit aplikace, zmírní riziko zranitelností injektování kódu čí sníží oprávnění, s jakým se aplikace spouštějí. V neposlední řadě zajistí zvýšenou bezpečnost uživatelů.

Syntaxe

Content-Security-Policy: <policy-directive>; <policy-directive>;

Definice parametrů hlavičky CSP

Z hlediska obsáhlosti možností nastavení CSP hlavičky uvádíme pouze část parametrů. Více informací viz. Užitečné zdroje níže.

default-src → definuje politiku všech typů a zdrojů, pokud není nastavena vlastní politika
script-src → definuje, které skripty mohou být spouštěny
object-src → definuje, od kud mohou být nahrány pluginy
style-src → definuje, jaké styly lze použít
img-src → definuje, od kud mohou být nahrány obrázky
media-src → definuje, od kud mohou být nahrány video a audio soubory
frame-src → definuje, od kud je možné vkládat rámy
font-src → definuje, od kud mohou být nahrány fonty
connect-src → definuje, z jaké URI se mohou nahrávat scripty
form-action → definuje, jaká adresu lze použít pro HTML form
sandbox → nastavení HTML sandbox politiky prohlížeče
report-uri → nastavení URI kam prohlížeč zašle porušení zásad
report-to → plánované nahrazení report-uri

K parametru je také možné uvést některé z klíčových slov.

'none' → zablokuje pužití tohoto zdroje
'self' → respektuje pouze vlastní doménu (current origin), ne subdomény
'unsafe-inline' → dovoluje u direktiv script-src a style-src povolit inline skripty
'unsafe-eval' → dovoluje použít mechanismus jako eval()
https: → vynucuje veškeré zdroje, které se mají načíst přes protokol HTTPS
data: → povoluje vkládané zdroje v kódování Base64

Krom výše uvedeného je možné používat i další funkce CSP.

block-all-mixed-content → zablokuje veškeré nahrání obsahu z http, pokud je stránka na https
upgrade-insecure-requests → prohlížeč bude načítat obsah pouze přes zabezpečený protokol
require-sri-for → vynucené požadování Subresource Integrity pro scripty nebo styly na stránce
Načítání pouze z HTTPS
Content-Security-Policy: default-src https:;

Jakékoliv externí a interní soubory a prvky lze načítat pouze přes zabezpečené HTTPS.

Načítání pouze z domény
Content-Security-Policy: default-src domenaxyz.cz;

Dovoluje načítat zdroje pouze a jenom z uvedené domény.

Použití klíčového slova
Content-Security-Policy: default-src 'none'; script-src https://domenaxyz.cz;

Nastavení blokuje načítání libovolného obsahu krom skriptů načtených z domény přes https.

(Vy)řešení tzv. mixed contentu
Content-Security-Policy: upgrade-insecure-requests;

Prohlížeč bude vynuceně načítat vše z https aby se vyhnul Mixed contentu. Vhodné nastavení pro větší weby při přechodu z nezabezpečeného http -> https. V případě že zdroj není dostupný po https protokolu, nenačte se.
Hlavička není funkční v prohlížeči IE (caniuse.com "upgrade-insecure-requests").

Nastavení CSP

.htaccess
# CSP settings
Header set Content-Security-Policy: "style-src 'self' https://cdnjs.cloudflare.com;"

Povolení načítání css stylů z domény a CDN CloudFlare.

Header set Content-Security-Policy "upgrade-insecure-requests;"

Jakékoliv zdroje s adresou http bude prohlížeč načítat přes zabezpečené HTTPS. Toto nastavení se hodí při přechodu webu na https komunikaci, kdy nejsme schopni změnit všechny původní absolutní odkazy "http://".
Nefunguje však v IE a Edge do verze 16 (CanIUse info).

Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' www.google-analytics.com"
Umístění kódu do hlavičky stránky
<head>
...
<!-- CSP meta tags -->
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<meta http-equiv="Content-Security-Policy" content="style-src 'self' https://maxcdn.bootstrapcdn.com; img-src 'self'">
...
</head>

V tagu <meta> lze hlavičky CSP rozdělit. Platí však vždy ta nejstriktnější nastavená politika!

Potenciální chyby v nastavení

Chybná konfigurace složitějšího nastavení CSP je naprosto běžná. Z toho důvodu je vhodné použít hlavičku Content-Security-Policy-Report-Only: <policy-directive>; <policy-directive>, která umožňuje vývojářům experimentovat s nastavením a sledovat chování vytvořených politik, aniž by došlo k jejich provedení. Prohlížeč hlavičku obdrží, zpracuje jí a bude se řídit definovanými pravidly, ale místo exekuce zajistí zpětnou vazbu o výsledku nastavení ve vývojářské konzoli.

Užitečné zdroje