Základní bezpečnostní HTTP hlavičky pro váš web

HTTP "security" headers jsou základním prvkem webové bezpečnosti. Když navštívíte jakoukoliv webovou stránku z vašeho prohlížeče, server vám společně s požadovaným obsahem pošle v odpovědi sadu HTTP hlaviček. Některé HTTP hlavičky říkají prohlížeči, jak se chovat při prohlížení webu. Správná konfigurace těchto hlaviček zajistí návštěvníkům mnohem bezpečnější prohlížení webové stránky a sníží riziko útoků proti nim.
Existuje celá řada HTTP hlaviček, kterých byste si měli být vědomi a pokud je to možné, doporučujeme je implementovat. Kontrola níže uvedených HTTP hlaviček také bývá prvním krokem během penetračního testu. Pojďme se na ně proto podívat blíže.
X-Frame-Options
HTTP hlavička X-Frame-Options říká prohlížeči, zde a za jakých okolností může konkrétní webovou stránku zobrazit v rámu. Samotné načtení stránky v iframe ještě nepředstavuje bezpečnostní riziko. Ovšem v určitých případech lze tuto funkcionalitu zneužít k různým útokům na klienta (např. clickjacking, podvodné hlasování v anketách, apod.).
Konkrétní nastavení má několik hodnot:
- DENY
- web nikdy není možné zobrazovat v iframe
- SAMEORIGIN
- web je možné zobrazit v iframe pouze na vlastní doméně
- ALLOW-FROM https://tunasec.com
- web je možné zobrazit v iframe pouze na povolených doménách
Ukázka konfigurace webového serveru:
Nginx
add_header X-Frame-Options "DENY" always;
Apache
Header always set X-Frame-Options "DENY"
V naprosté většině případů si vystačíte s hodnotou DENY, tedy zakázat možnost vkládání vaší webové stránky do iframe.
X-XSS-Protection
Hlavička X-XSS-Protection říká prohlížeči, zda a jak má použít vestavěný filtr proti XSS (Cross-Site Scripting) útokům. To se týkalo hlavně starších verzí Google Chrome, v současné době je doporučeno použít hlavičku CSP (Content-Security-Policy).
Konkrétní nastavení má několik hodnot:
- 1; mode=block
- při detekci XSS útoku prohlížeč zablokuje celou stránku
- 1; report=
- při detekci XSS se prohlížeč pokusí zablokovat pouze daný útok a zároveň odešle report
- 1
- při detekci XSS se prohlížeč pokusí zablokovat pouze daný útok
- 0
- XSS filter je vypnutý
Ukázka konfigurace webového serveru:
Nginx
add_header X-XSS-Protection "1; mode=block" always;
Apache
Header always set X-XSS-Protection "1; mode=block"
XSS Auditor původně představený v prohlížečích Chrome a Safari, měl pomoci zabránit běžným XSS útokům. V některých případech však způsoboval potíže a nebylo jej těžké obejít, dnes se tak používá více méně pro ochranu uživatelů používajících starší verze prohlížečů.
X-Content-Type-Options
Hlavička X-Content-Type-Options říká prohlížeči, aby respektoval MIME type hodnotu souborů podle hlavičky Content-Type a nezkoušel MIME type odhadnout na základě obsahu souboru. Zjednodušeně řešeno, prohlížeč bude interpretovat vzdálený JavaScript v HTML tagu script, pouze pokud načítaný soubor zasílat správnou hlavičku s Content-Type “application/javascript.
Konkrétní nastavení má pouze jednu hodnotu:
- nosniff
- Zakázání “content sniffingu” a interpretace souborů pouze podle MIME type (Content-Type).
Ukázka konfigurace webového serveru:
Nginx
add_header X-Content-Type-Options "nosniff" always;
Apache
Header always set X-Content-Type-Options "nosniff"
To zabrání útočníkům načítat a interpretovat například JavaScript schovaný v obrázku, který se podařilo nahrát na server. Efektivně tak uživatele ochrání před útoky pomocí tzv. polyglot souborů, které se tváří jako několik validních typů souborů současně.
Referrer-Policy
HTTP hlavička Referrer-Policy určuje, kolik informací o referreru (odeslaných prostřednictvím hlavičky Referer) by mělo být zahrnuto do requestů webového prohlížeče. Kromě hlavičky HTTP můžete toto pravidlo nastavit v HTML.
Konkrétní nastavení má několik hodnot:
- no-referrer
- Referer hlavička je vypnuta. Spolu s requesty se neposílají žádné informace.
- no-referrer-when-downgrade
- Když úroveň zabezpečení (SSL) zůstane stejná nebo se zlepší (HTTP → HTTPS), odešlete origin, cestu a řetězec dotazu v hlavičce Referer. Referer se neposíla v requestech na méně zabezpečené cíle (HTTPS → HTTP).
- origin
- Odesílá se pouze origin. Například URL
https://example.com/?username=admin&pass=loveodešle pouzehttps://example.com/.
- Odesílá se pouze origin. Například URL
- origin-when-cross-origin
- Při provádění požadavku v rámci stejneho originu na stejnou úroveň protokolu (SSL) odešlete origin, cestu a řetězec dotazu. Odesíla origin (pouze) pro requesty směřující z HTTPS → HTTP.
- same-origin
- Odesíla origin, cestu a řetězec dotazu pro požadavky v rámci stejného originu (domény). Neposílá Referer hlavičku při requestech na jiné domény.
- strict-origin
- Posílá (pouze) origin, při requestech v rámci stejné úrovně zabezpečení (HTTPS→HTTPS). Neposílá Referer hlavičku při requestech z HTTPS → HTTP.
- strict-origin-when-cross-origin
- Odesíla origin, cestu a řetězec dotazu pro požadavky v rámci stejného originu (domény). Při requestech na jiné domény (HTTPS → HTTPS) posíla pouze origin.
- unsafe-url
- Při provádění jakéhokoli požadavku, bez ohledu na zabezpečení, odešlete origin, cestu a řetězec dotazu.
Ukázka konfigurace webového serveru:
Nginx
add_header Referrer-Policy "same-origin" always;
Apache
Header always set Referrer-Policy "same-origin"
Referer může v určitých případech prozradit citlivé informace o uživatelích, například ID v URL adrese při přechodu návštěvníka z jedhoho webu na druhý. Ideálně by se tak měla tato informace předávat pouze v rámci jednoho originu.
Permissions-Policy
HTTP hlavička, která se původně jmenovala Feature-Policy, říka přohlížečí, jaké funkce může na webu používat. Například zakazuje přístup ke kameře a mikrofonu.
Konkrétní nastavení má několik hodnot:
- Konkrétní funkcionalita, například (camera, microphone, geolocation, ...).
- Několik hodnot, * - povolí, none / () použití zakáže.
Ukázka konfigurace webového serveru:
Nginx
add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" always;
Apache
Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"
Konkretní funkce zavisí na verzi a typu webového prohlížeče, nastavení pak na konkrétních potřebách webového serveru. Je doporuřeno vypnout ty, které váš web nepotřebuje.
Strict-Transport-Security
Hlavička Záhlaví odpovědi HTTP Strict-Transport-Security (často zkráceně HSTS) umožňuje webovým serverům sdělit prohlížečům, že by k nim měl být přistupovat pouze pomocí HTTPS, namísto použití HTTP.
Konkrétní nastavení má několik hodnot:
- max-age=
- Čas v sekundách, kdy by si měl prohlížeč pamatovat, že k webu je možné přistupovat pouze pomocí protokolu HTTPS.
- includeSubDomains
- Pokud je zadán tento volitelný parametr, toto pravidlo platí také pro všechny subdomény webu.
- preload
- Prohlížeče se k vaší doméně nikdy nepřipojí pomocí nezabezpečeného připojení HTTP.
Ukázka konfigurace webového serveru:
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
V současné době není důvod nepoužívat HTTPS a Strict-Transport-Security je další krok pro ochranu vašich uživatelů před útoky typu MITM/PITM (person-in-the-middle).
Content-Security-Policy
HTTP hlavička Content-Security-Policy umožňuje správcům webových stránek řídit zdroje, které může prohlížeč načíst pro danou stránku. Je tak možné například zakázat načítaní JavaScript z cizí domény.
Konkrétní nastavení má několik hodnot:
( ) - Directive je zdroj, se kterým web pracuje (CSS, JS, fonty, obrázky, ...).
- Pro každý zdroj je možné ovlivnit, odkuj se může načítat (none - načítání zakázáno, self - načítání zdrojů pouze ze stejné domény, unsafe-inline - načítání inline zdrojů (CSS/JavaScript, který není ve vlastním souboru) ...
Ukázka konfigurace webového serveru:
Nginx
add_header Content-Security-Policy "default-src 'self'" always;
Apache
Header always set Content-Security-Policy "default-src 'self'"
Správné nastavení Content-Security-Policy je celkém složité, každopádně velice zvyšuje zabezpečení. Dokáže například eliminovat XSS (Cross-Site Scripting) útoky. Tato hlavička si zaslouží svůj vlastní článek, případně doporučujeme rovnou se obrátit na oficiální dokumentaci :)
Pro kontrolu vašeho webu a ověření správnosti konfigurace (včetně známky), můžete použít bezplatný nástroj securityheaders.com. Pro zlepšení bezpečnosti je můžete nastavit ještě dnes!

Zdroje:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy