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 :)