Bezpečnostní HTTP hlavičky: CSP, HSTS, nosniff a Referrer-Policy

Bezpečnostní hlavičky dávají prohlížeči pravidla pro práci s obsahem, HTTPS a předáváním informací. Jsou další obrannou vrstvou — nenahrazují aktualizace, bezpečný kód ani správné řízení přístupu.

Bezpečný postup

Začněte bezpečnými hlavičkami X-Content-Type-Options a Referrer-Policy. CSP nejprve sledujte v režimu Report-Only a HSTS zapínejte až po ověření spolehlivého HTTPS na všech dotčených hostech.

Co jsou bezpečnostní HTTP hlavičky

Webserver posílá s odpovědí metadata, podle kterých prohlížeč zachází s obsahem. Bezpečnostní hlavičky mohou omezit načítání nedůvěryhodných zdrojů, MIME sniffing, únik celé odkazující adresy nebo návrat uživatele na nešifrované HTTP.

Jde o obranu do hloubky. Správná hlavička může zmírnit dopad určité chyby, ale neodstraní zranitelný kód. Stejně důležité zůstávají aktualizace, validace vstupů, escapování výstupu, bezpečné cookies a nejnižší potřebná oprávnění.

Čtyři hlavičky sledované auditem

Content-Security-Policy
Omezuje zdroje, ze kterých smí stránka načítat skripty, styly, obrázky, fonty a další obsah. Pomáhá zmírnit XSS a injekce, ale musí odpovídat konkrétní stránce.
X-Content-Type-Options
Hodnota nosniff říká prohlížeči, aby respektoval deklarovaný Content-Type a nehádal jiný spustitelný typ.
Referrer-Policy
Určuje, kolik informací z adresy zdrojové stránky se odešle při přechodu nebo načtení zdroje.
Strict-Transport-Security
Po přijetí přes HTTPS instruuje prohlížeč, aby daný host po dobu max-age používal pouze přes HTTPS.
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'

Poslední dvě hodnoty nejsou univerzální konfigurací k okamžitému zkopírování. HSTS ovlivňuje budoucí připojení a CSP může zablokovat legitimní části webu.

CSP nejprve pozorujte, teprve potom vynucujte

Začněte inventurou všech zdrojů: vlastních i externích skriptů, analytiky, fontů, obrázků, videí, iframe a formulářových cílů. Připravte politiku a pošlete ji nejprve jako Content-Security-Policy-Report-Only. Prohlížeč bude porušení hlásit, ale obsah ještě nezablokuje.

Content-Security-Policy-Report-Only:
  default-src 'self';
  script-src 'self';
  style-src 'self';
  img-src 'self' data: https:;
  font-src 'self';
  object-src 'none';
  base-uri 'self';
  frame-ancestors 'self';
  form-action 'self'
  1. 01

    Zmapujte legitimní zdroje

    Projděte hlavní typy stránek, formuláře, přihlášení, platby a vložený obsah.

  2. 02

    Zapněte Report-Only

    Sledujte konzoli prohlížeče nebo zabezpečený reportovací endpoint. Reporty mohou obsahovat citlivé URL, proto s nimi zacházejte jako s provozními daty.

  3. 03

    Odstraňte příčiny, ne ochranu

    Preferujte nonce nebo hash pro nutné inline skripty. Automatické přidání 'unsafe-inline' výrazně oslabuje účel politiky.

  4. 04

    Přepněte na vynucovanou CSP

    Až po funkčních testech změňte název hlavičky na Content-Security-Policy a dál sledujte chyby.

HSTS nastavujte po menších krocích

HSTS funguje až poté, co jej prohlížeč obdrží přes platné HTTPS. Během uložené doby už uživateli nedovolí obejít chybu certifikátu ani navštívit HTTP variantu daného hostu.

Nezačínejte includeSubDomains ani preload

Nejprve ověřte automatickou obnovu certifikátu a všechny používané subdomény. Krátký testovací max-age postupně navyšujte. Volba includeSubDomains zasáhne i budoucí subdomény a preload má samostatné podmínky a pomalé vracení zpět.

# první kontrolované nasazení
Strict-Transport-Security: max-age=300

# později po ověření provozu
Strict-Transport-Security: max-age=31536000

Příklady pro webserver a aplikaci

Nastavte hlavičky na jednom předvídatelném místě. Duplicitní nebo konfliktní hodnoty od aplikace, proxy, CDN a webserveru mohou mít jiné chování, než očekáváte.

Apache / sdílený hosting s mod_headers

<IfModule mod_headers.c>
  Header always set X-Content-Type-Options "nosniff"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Strict-Transport-Security "max-age=300" "expr=%{HTTPS} == 'on'"
  Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'"
</IfModule>

Nginx

add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=300" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'" always;

U Nginxu posílejte HSTS pouze z HTTPS server bloku. U aplikace za reverzní proxy ověřte, kde se TLS ukončuje a zda se hlavička nepřidává dvakrát.

Ověření po nasazení

curl -sI https://example.com/ | grep -Ei \
'content-security-policy|strict-transport-security|x-content-type-options|referrer-policy'
  • Otestujte hlavní stránku, detail, formulář, přihlášení a chybovou stránku.
  • Projděte konzoli prohlížeče a síťové požadavky bez chyb CSP.
  • Ověřte hlavičky také na přesměrováních a chybových odpovědích.
  • Zkontrolujte, že HTTP přesměruje na správnou HTTPS adresu.

Audit CoderPro sleduje pouze přítomnost CSP, X-Content-Type-Options, Referrer-Policy a u HTTPS také HSTS. Nevaliduje úplnou bezpečnost jejich hodnot ani funkčnost webu po jejich zavedení.

Ověřené zdroje

Stručné odpovědi bez zkratek

Stačí zkopírovat jednu CSP z internetu?

Ne. CSP musí odpovídat skutečným zdrojům skriptů, stylů, obrázků, fontů a rámců konkrétního webu. Příliš přísná politika může rozbít funkce, příliš volná poskytne malou ochranu.

Lze HSTS kdykoliv snadno vrátit zpět?

Ne okamžitě. Prohlížeč si pravidlo pamatuje po dobu max-age. includeSubDomains a preload proto používejte až tehdy, když je HTTPS spolehlivé na všech dotčených subdoménách.

Zabezpečí samotné hlavičky celý web?

Ne. Omezují některé třídy rizik v prohlížeči, ale nenahradí opravy zranitelností, aktualizace, validaci vstupů, bezpečné cookies, oprávnění ani monitoring.