Zabezpečení webu pomocí HTTP hlaviček

PHP Webdesign

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Content Security Policy

Jedná se o HTTP hlavičku, která řekne prohlížeči, jestli obsah na stránce má být čistě na protokolu https, nebo že se dokonce musí nacházet přímo na doméně, kde web běží. Lze to členit i zvlášť na obrázky, skripty, styly, fonty, média (<audio> a <video>) a další.

Jedná o ochranu před XSS napadením. Celý popis, včetně podpory v prohlížečích nalezne zde: https://content-security-policy.com/

Povolení pouze vlastních zdrojů:

Content-Security-Policy: default-src 'self';

Povolení pouze vlastních zdrojů s výjimkou skriptů, které mohou být i na serveru https://code.jquery.com:

Content-Security-Policy: default-src 'self'; script-src 'self' https://code.jquery.com;

Jinak pozor: u ‚self‘ nelze používat inline styly, u nich je potřeba povolit i „zdroj“ ‚unsafe-inline‘ (ale je lepší inline styly a skripty vůbec nepoužívat):

Content-Security-Policy: default-src 'self' 'unsafe-inline';

HTTP Strict Transport Security

Hlavička Strict-Transport-Security je pro prohlížeč informací, že má po určitou dobu komunikovat s webovým serverem pouze přes protokol https:

Strict-Transport-Security: max-age=31536000

Dokonce lze prohlížeči říct, aby https vyžadoval i po subdoménách:

Strict-Transport-Security: max-age=31536000; includeSubDomains

Google a Firefox také umožňují přidat stránku na seznam webů, které HSTS mají a tento seznam je součástí prohlížeče, takže už i při prvním načtení stránky je vyžadováno https:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Subresource Integrity

Tato metoda „zajišťuje“ (v uvozovkách, protože se jedná o volbu prohlížeče), že zdroj (styl, skript a další) zkutečně odpovídá tomu, co očekáváte, že tam je. Prohlížeč tedy zkontroluje dle hashe „integritu“ souboru. Nejedná se o HTTP hlavičku a patří to poměrně blízko.

Jedná se atribut „integrity“, kde uvedete hash, který si prohlížeč ověří na zdroji, který stáhne. V takovém případě se vám tedy nestane, že pokud někdo „hackne“ server třetí strany a nahraje tam škodlivý kód, že se stáhne i na vaše stránky – už totiž nemá správný hash (kontrolní otisk souboru), který prohlížeč očekává.

Například u jQuery:

<script src="http://code.jquery.com/jquery-3.1.1.min.js" 
 integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>

Zde je nástroj jak hash jednoduše získat: https://www.srihash.org/

X-Content-Type-Options

Hlavička z nadpisu umožňuje využít funkce prohlížeče, který ověří zda zdroj má v hlavičce správný MIME typ (styly – text/css atd.). Jedná se o další z ochran proti XSS.

Stačí definovat jednoduše takto:

X-Content-Type-Options: nosniff

X-Frame-Options

Poslední ze (v článku uvedených) zabezpečovacích hlaviček říká, jestli má být vaše stránka dostupná v rámu. Lže umožnit použitý v rámu pouze v rámci domény nebo třeba zakázat všude. Tato hlavička vás ochrání před tím, že si nějakých útočník vloží vaší stránku do své a překryje je průhlednou vrstvou (s nastavenými událostmi nebo odkazy) – návštěvník si tedy myslí, že kliká do vaší stránky a přitom vyvolá úplně jinou událost. Tomu se říká „clickjacking“.

Omezení na použití v rámu v rámci domény:

X-Frame-Options: SAMEORIGIN

Zamezení všude:

X-Frame-Options: DANY

Zamezení všude, kromě domény www.kamaradskyweb.cz:

X-Frame-Options: ALLOW-FROM https://www.kamaradskyweb.cz

Toto je ale bráno jako zastaralé a je doporučováno použít Content Security Policy s direktivitou frame-ancestors, která dělá v podstatě to samé:

Content-Security-Policy: frame-ancestors https://www.kamaradskyweb.cz

Závěr

Doufám, že tento příspěvek, který jsem si sepsal jako rychlou příručku bude užitečný i někomu další.

Pokud si chcete zkontrolovat, že všechny hlavičky máte správně nastavené, použijte https://observatory.mozilla.org.

Zde je příklad použítí hlaviček v PHP:

<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' code.jquery.com cdnjs.cloudflare.com; style-src 'self' fonts.googleapis.com; font-src fonts.gstatic.com");
header("Strict-Transport-Security: max-age=31536000");
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: DENY");
?>

Zdroje:
https://content-security-policy.com/
https://wiki.mozilla.org/Security/Guidelines/Web_Security
https://cs.wikipedia.org/wiki/HTTP_Strict_Transport_Security
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
https://www.w3.org/TR/SRI/
https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity
https://msdn.microsoft.com/en-us/library/gg622941(v=vs.85).aspx
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet
https://tools.ietf.org/html/rfc7034
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře