Přejít na obsah
Zpět na blog

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

Kamil Vavra6 min čtení
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=love odešle pouze https://example.com/.
  • 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!

TunaSec.com HTTP headers


Zdroje: