CSP (Content Security Policy): bezpečnostní politika pro obsah

CSP (Content Security Policy): Politika bezpečnosti obsahu

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 (nebo Content-Security-Policy-Report-Only př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 u script-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: a blob:, 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-src a child-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 k X-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-to a report-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-...' (nebo sha384/sha512).
  • strict-dynamic: pokud je tato direktiva přítomna a je k dispozici alespoň jeden nonce nebo hash, 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-src a script-src brá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 crossorigin a mezipaměť.
  • media-src: streamy povolujte selektivně; u externích přehrávačů přidejte frame-src s 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-uri nebo report-to pro 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

  1. Audit: zapněte režim Report-Only a při skutečném provozu shromažďujte hlášení o porušeních alespoň několik dní.
  2. Refaktoring vloženého kódu: přesuňte vložené skripty a styly do souborů nebo zaveďte nonce/hash.
  3. Mapování služeb třetích stran: určete, které domény jsou nezbytné; jejich počet snižujte a verze udržujte.
  4. Postupné zpřísňování: nejprve nastavte object-src 'none' a base-uri 'self', poté script-src a style-src bez 'unsafe-inline'.
  5. 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 * nebo script-src https: bez dalších omezení.
  • Ignorování frame-ancestors a spoléhání pouze na X-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' a frame-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-uri aktivní 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.