Tento článek patří do seriálu Security headers. Ostatní články seriálu:
- Security headers - Co jsou a jak na ně
- HTTPS nestačí, jak na HSTS a HPKP
- Bezpečnost a expirace sessions v PHP
- Content Security Policy
- Report URI - Správce reportů z prohlížeče
Bezpečnostní hlavičky neboli security headers, jsou speciální HTTP hlavičky, které mění či zapínají některé chování prohlížečů. Tím dokáží zabezpečit web proti různým XSS či Clickjacking útokům, zabezpečit session cookies nebo nastavit striktní HTTPS protokol.
Ostatní bezpečnostní hlavičky jsou trochu náročnější na popis, a proto si zasloužily vlastní články zařazené v tomto seriálu. Doporučuji si projít HTTPS a HSTS, Zabezpečení session a CSP.
Doporučený seznam
Bezpečnostních hlaviček je celá spousta, všechny by ale měly být nastaveny, pokud se nejedná o speciální případy. Dobrou kontrolou může být web securityheaders.com, který krásně znázorní a upozorní na chybějící hlavičky či případné chyby v jejich zápisu. Dobrým zdrojem může být i český web securityheaders.cz.
X-Content-Type-Options
Pro tuto hlavičku existuje jediná možnost jak ji zapsat X-Content-Type-Options: nosniff
. Říká prohlížeči, aby se nepokoušel uhádnout mime-type souboru. Pokud se pokusí stáhnout JS nebo CSS soubor, jejichž typ není validní JS nebo CSS mime-type, ale třeba text/plain, soubor zablokuje. Taky zapne CORB (Cross-Origin Read Blocking), více o tomto chování je v dokumentaci.
X-Frame-Options
Zakáže zobrazení webu v iframe. Toto je dobrá obrana proti Clickjackingu. Zobrazení ve framech lze úplně zakázat pomocí X-Frame-Options: deny
, nebo povolit jen ze stejné domény
X-Frame-Options: sameorigin
. Například YouTube také používá tuto hlavičku. Pouze pokud použijete adresu jako je youtube.com/embed/VIDEO_ID
, tak tuto hlavičku neposílá.
Referrer-Policy
Hlavička určuje, kdy má prohlížeč posílat referrer a v jakém formátu. Doporučuji prostudovat tabulku a vysvětlení na developer.mozilla.org. Osobně na blogu používám Referrer-Policy: no-referrer-when-downgrade
, tedy neposílat referrer pokud odkazuji z HTTPS na HTTP.
V informačních systémech ale používám Referrer-Policy: strict-origin-when-cross-origin
, tedy pošle pouze doménu, bez konkrétní cesty a query parametrů, pokud odchází na cizí URL.
Feature-Policy
Prohlížeče stále více umožňují přístup k různým periferiím. Jako je fotoaparát, GPS, akcelerometr a mnoho dalšího. Pomocí této hlavičky je možné webu přístup k jednotlivým funkcím zakázat. Důležité ale je, že toto zakáže i cizímu webu, pokud je vložen přes iframe. Hlavička je stále ve vývoji, ale nemusí být úplně marné ji přidat.
X-XSS-Protection
Tato hlavička zapne XSS auditora v prohlížeči. Pokud prohlížeč v requestu nalezne kód, který je při responsu spuštěn, tak tento kód zablokuje. Ukázku lze najít třeba na securityheaders.cz/x-xss-protection. Hlavičku lze zapsat vícero způsoby, ideální ale je X-XSS-Protection: 1; mode=block
Tato hlavička je už v důchodu, Edge od verze 17 a Chrome od verze 78 implementaci auditoru zrušili. Firefox jej nikdy neimplementoval. Použití je již spíše z historických důvodů.
- Prvním důvodem zrušení je náročnost kontroly, která zpomalovala vykreslení.
- Druhým fakt, že vždy po vydání nové verze se našel způsob, jak auditora obejít.
- Třetím, že je mnohem lepší využít Content Security Policy.
Implementace hlaviček
Ideální samozřejmě je, pokud se nastaví odesílání hlaviček přímo v .htaccesu, protože pak jsou hlavičky odesílány i při stahování souborů, obrázků a assetů. Jenže to je mnohem složitější na administraci a případnou úpravu. Mnohem jednodušší to je řešit v samotném frameworku.
Osobně jsem tedy do htaccessu dal pouze 2 hlavičky, které je znázorněno níže. A ano, mělo by tam být i HSTS ideálně. Všechny ostatní hlavičky poté nastavuji pomocí knihovny Secure Headers, která obsahuje přímou integraci do Laravelu. Je ale možné ji použít i samostatně.
Header always set X-Frame-Options sameorigin Header always set X-Content-Type-Options nosniff
Zkušenosti s bezpečnostními hlavičkami a jinými můžete sdílet v komentářích. Cover obrázek převzat od Pikisuperstar.
K tomuto článku již není možné přidávat další komentáře