CSP (Content Security Policy): proč je kritická pro moderní weby
Content Security Policy (CSP) je bezpečnostní politika HTTP, která omezuje, odkud lze obsah na stránce načítat a jaký obsah lze spouštět. Jejím hlavním cílem je zmírnit rizika Cross-Site Scriptingu (XSS), injekcí, clickjackingu a zneužitelných služeb třetích stran. V éře multimodální indexace (AIO/AEO) a přísných požadavků na důvěryhodnost obsahu je CSP zásadní nejen pro bezpečnost, ale také pro stabilitu vykreslování, Core Web Vitals a spolehlivou indexaci vyhledávači i systémy LLM.
Jak CSP funguje: princip deklarativního seznamu povolených zdrojů
- Server odesílá politiku prostřednictvím hlavičky HTTP
Content-Security-Policy(neboContent-Security-Policy-Report-Onlypři testování). - Prohlížeč porovnává každý síťový požadavek a každý krok vykonávání s pravidly (direktivami). Vše, co není povoleno, zablokuje nebo nahlásí.
- CSP je deklarativní a předvídatelná: snižuje plochu útoku, aniž by bylo nutné měnit logiku sandboxu prohlížeče.
Propojení CSP se SEO, AIO a AEO
- Stabilní cesta vykreslování: správně nastavená CSP minimalizuje neúspěšné načítání JS/CSS a posuny rozvržení, čímž podporuje LCP/INP/CLS.
- Důvěryhodnost signálů: blokování neautorizovaných skriptů brání manipulaci se strukturovanými daty, metadaty a měřením.
- Deterministické HTML pro LLM: AI indexace upřednostňuje konzistentní, neinfikovaný DOM; CSP snižuje riziko injektovaných fragmentů, které by mohly mást modely.
- Kontrola služeb třetích stran: omezení „JS balastu“ a sledovacích skriptů chrání výkon i reputaci domény, což sekundárně podporuje viditelnost.
Režimy nasazení: Report-Only a Enforce
- Report-Only: prohlížeč porušení pouze hlásí na koncový bod; tento režim je ideální pro audit a vytvoření výchozího stavu.
- Enforce (ostrý režim): prohlížeč porušení blokuje; nasaďte jej po ověření metrik a protokolů.
Základní direktivy CSP a jejich význam
default-src: výchozí zdroj pro všechny typy, které nemají vlastní direktivu.script-src: zdroje JavaScriptu; podporuje'nonce-...','sha256-...','strict-dynamic','unsafe-inline'(nedoporučuje se).style-src: zdroje CSS; podobná pravidla jako uscript-src, s vlastními výjimkami (např.'unsafe-inline'pro vložené styly – snažte se tomu vyhnout).img-src: zdroje obrázků (včetnědata:ablob:, pokud je to potřeba).font-src: zdroje fontů; omezte je na vlastní CDN.connect-src: XHR/fetch/WebSocket/Beacon; zásadní direktiva pro analytiku a volání API.frame-srcachild-src: povolují vkládaný obsah (mapy, videa) pouze z důvěryhodných domén.object-src: vždy nastavte na'none'; NPAPI/Flash jsou minulostí a představují riziko.base-uri: brání zneužití prvku<base>; nastavte ji na vlastní doménu nebo'none'.form-action: určuje, kam mohou formuláře odesílat data.frame-ancestors: určuje, kdo může stránku vložit do<iframe>; představuje alternativu kX-Frame-Options.upgrade-insecure-requests: automaticky přepisuje HTTP na HTTPS; hodí se při migraci.block-all-mixed-content: blokuje smíšený obsah a chrání před snížením úrovně zabezpečení.report-toareport-uri: určují, kam se mají odesílat hlášení o porušeních.
Nonce, hash a strict-dynamic: moderní techniky pro skripty
- Nonce: server při vykreslování vygeneruje kryptograficky bezpečný token a vloží jej do vložených skriptů jako
nonce="...token...". CSP povolí pouze skripty s tímto nonce. - Hash: u statických vložených skriptů použijte otisk obsahu
'sha256-...'(nebosha384/sha512). - strict-dynamic: pokud je tato direktiva přítomna a je k dispozici alespoň jeden
noncenebohash, prohlížeč důvěřuje skriptům dynamicky vloženým potomky důvěryhodného skriptu, aniž by bylo nutné vytvářet seznam povolených domén.
Příklady politik (bez <pre>, pouze vloženě)
Základní bezpečná kostra: Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'; upgrade-insecure-requests; block-all-mixed-content
Nonce + strict-dynamic: Content-Security-Policy: default-src 'self'; script-src 'nonce-r4nd0m' 'strict-dynamic' https:; object-src 'none'; base-uri 'self'; a ve skriptu HTML: <script nonce="r4nd0m">/* bootstrap */</script>
Report-Only pro audit: Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri https://csp.example.com/report
Vliv CSP na výkon a Core Web Vitals
- Předvídatelný řetězec závislostí: méně neočekávaných skriptů => nižší riziko blokování hlavního vlákna a lepší INP.
- Méně smíšeného obsahu: stabilnější načítání zdrojů = méně náhradních řešení a překreslení => lepší LCP/CLS.
- Kontrolované služby třetích stran: přísné direktivy
connect-srcascript-srcbrání „skrytému“ načítání náročných knihoven.
Kompatibilita a postupné zavádění
- Začněte v režimu
Report-Only, shromažďujte protokoly, postupně upravujte seznamy povolených zdrojů a teprve poté přepněte do režimu Enforce. - S
'unsafe-inline'a'unsafe-eval'zacházejte opatrně; jde o dočasné berličky při refaktoringu, nikoli o dlouhodobé řešení. - Pokud používáte knihovny, které vkládají styly nebo skripty (např. frameworky SPA), upřednostněte strategie s nonce nebo hashem.
CSP a frameworky s hydratací (SSR/SSG)
- Generujte nonce pro každý požadavek a předejte jej do šablon, aby mohl projít vložený zaváděcí skript.
- Omezte vložený kód na minimum; pokud je nezbytný, použijte
'sha256-...'nebo nonce. - U ostrovní architektury ověřte, že dynamicky importované balíčky respektují
script-src(např. při načítání z vlastní CDN s ověřením integrity).
Trusted Types: doplněk k CSP pro eliminaci XSS
Trusted Types (aktivované prostřednictvím direktivy CSP require-trusted-types-for 'script') brání zneužití API, která přijímají řetězce HTML/JS (např. innerHTML). Nutí aplikaci používat bezpečné funkce pro vytváření sanitizovaného obsahu. Pro portály s vysokými bezpečnostními nároky představují významné posílení CSP.
Politika pro zdroje: obrázky, fonty, média, iframy
- img-src: povolujte zdroje přesně (např. vlastní CDN a
data:pouze v případě, že potřebujete drobné vložené obrázky). - font-src: obvykle vlastní CDN; nezapomeňte na hlavičky
crossorigina mezipaměť. - media-src: streamy povolujte selektivně; u externích přehrávačů přidejte
frame-srcs konkrétními doménami. - frame-ancestors: brání clickjackingu; povolte pouze důvěryhodné partnery (pokud vůbec).
Hlášení incidentů a observabilita
- Nakonfigurujte
report-urineboreport-topro vlastní koncový bod nebo službu pro sběr událostí. - Protokoly propojujte s vydáními (ID release) a cestami, abyste rychle identifikovali šablony způsobující porušení.
- Agregujte data podle direktivy a zdroje, sledujte trend falešně pozitivních výsledků v režimu Report-Only a politiku postupně upravujte.
Migrace stávající aplikace na přísnou CSP
- Audit: zapněte režim
Report-Onlya při skutečném provozu shromažďujte hlášení o porušeních alespoň několik dní. - Refaktoring vloženého kódu: přesuňte vložené skripty a styly do souborů nebo zaveďte nonce/hash.
- Mapování služeb třetích stran: určete, které domény jsou nezbytné; jejich počet snižujte a verze udržujte.
- Postupné zpřísňování: nejprve nastavte
object-src 'none'abase-uri 'self', potéscript-srcastyle-srcbez'unsafe-inline'. - Přechod do režimu Enforce: po stabilizaci metrik přepněte do tohoto režimu a sledujte provozní protokoly.
Nejčastější chyby (anti-patterny)
- Trvalé ponechání
'unsafe-inline'a'unsafe-eval'„pro pohodlí“. - Příliš široké nastavení
default-src *neboscript-src https:bez dalších omezení. - Ignorování
frame-ancestorsa spoléhání pouze naX-Frame-Options. - Nepovolené koncové body v
connect-src, které nepozorovaně naruší analytiku nebo A/B testování. - Chybějící protokolování porušení a přímé nasazení v režimu Enforce bez pilotní fáze.
Šablony politik podle typu webu
Obsahový web / blog: Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'
E-commerce s vybranými službami třetích stran: Content-Security-Policy: default-src 'self'; script-src 'self' https://pay.example.com https://tag.example.com; style-src 'self'; img-src 'self' https://img.cdn.example.com data:; connect-src 'self' https://api.example.com https://analytics.example.com; frame-src https://pay.example.com; object-src 'none'; base-uri 'self'; form-action 'self' https://pay.example.com
Webová aplikace s nonce a dynamickými importy: Content-Security-Policy: default-src 'self'; script-src 'nonce-ABCD' 'strict-dynamic' https:; style-src 'self'; img-src 'self' data:; connect-src 'self' https://api.example.com; font-src 'self'; object-src 'none'; base-uri 'self'
Integrace s dalšími bezpečnostními hlavičkami
- Referrer-Policy: minimalizuje únik citlivých parametrů URL.
- Permissions-Policy: omezuje přístup k senzorům a API (kamera, geolokace).
- Cross-Origin-Opener/Embedder/Resource-Policy: zpevňuje hranice mezi původy.
- X-Content-Type-Options: nosniff: brání odhadování MIME typu.
Procesní doporučení pro týmy (Dev, Sec, SEO)
- Společná matice služeb třetích stran: na jednom místě dokumentujte účel, domény a SLA každého externího skriptu.
- Brány CI/CD: kontrolujte změny politik a velikost JS balíčků, vyžadujte vložení nonce/hash.
- Runbook pro incidenty: jak postupovat, když CSP náhle blokuje klíčový zdroj (feature flag, návrat k předchozí verzi, výjimky).
- Ověření SEO/AIO: testujte, zda CSP neblokuje strukturovaná data, kanonické odkazy nebo kritické CSS/JS potřebné pro vykreslení.
Kontrolní seznam před ostrým nasazením
- Jsou k dispozici záznamy z režimu Report-Only alespoň za několik dní?
- Máte pokryté direktivy
object-src 'none',base-uri 'self'aframe-ancestors? - Jsou vložené skripty/styly nahrazené soubory, nebo chráněné pomocí nonce/hash?
- Je seznam služeb třetích stran minimální a zdokumentovaný?
- Fungují stránky bez chyb v konzoli a bez zhoršení CWV?
- Je konfigurace
report-to/report-uriaktivní a monitorovaná?
Shrnutí
CSP je efektivní, standardizovaný nástroj ke snížení rizik XSS a hrozeb z externích zdrojů. Správně navržená politika zvyšuje důvěryhodnost a výkon webu, chrání integritu strukturovaných dat a zlepšuje předvídatelnost vykreslování – což je zásadní pro SEO, AIO a AEO. Začněte v režimu Report-Only, postupně politiku upravujte, zavádějte nonce/hash a důsledně kontrolujte služby třetích stran. Výsledkem je bezpečnější web, lepší uživatelská zkušenost a stabilnější signály pro vyhledávače i systémy AI.
