Aneb jak s použitím securityheaders.io udělat web bezpečnějším díky několika hlavičkám.

V čem bezpečnější? Zajistíte načítání stránky jen a pouze protokolem HTTPs. Snížíte riziko MitM (Man-in-the-middle) útoku, clickjackingu a XSS. Potřebujete vědět jaký používáte webserver. Je-li to nginx a máte možnost nastavovat nginx.conf jde o několik řádek, které přidáte do tohoto souboru. Pokud máte Apache nebo nemůžete nastavovat konfiguraci nginx musíte použít soubor .htaccess Všechny hlavičky budete přidávat do následujích tagů:

Hlavička X-XSS-Protection nastavuje XSS Auditor. Volba 1 jej zapíná a když auditor detekuje Reflected XSS, tak se stránka pro jistotu vůbec nezobrazí. Volba 0 tuto možnost vypne

Header set X-XSS-Protection "1; mode=block"

X-Frame-Options říká podmínky vložení obsahu do iframe. V mém případě zakazuju. Setkáte se i s volbou SAMEORIGIN (tzn. stejná doména, protokol a port)

Header always append X-Frame-Options DENY

X-Content-Type-Options říká prohlížeči, že si nemá interpretovat MIME souboru sám, ale nechat to na webserveru. Proto, aby Vám například Chrome nechtěl spustit js v txt souboru. Aneb Google nejlíp ví co to je.

Header set X-Content-Type-Options nosniff

Referrer-Policy, říká za jakých podmínek má webserver předávat odkud jste na přišli. Jde hlavně o situace přechodu z HTTPs na HTTP. V tomto případě já referrer nepředávám.

Header set Referrer-Policy: strict-origin

Feature-Policy, ovlivňuje přístup stránky ke zdrojům stroje. Opravdu mě nezajímá poloha, mikrofon, akcelerometr,… proto volba none.

Header always set Feature-Policy "geolocation 'none'; accelerometer 'none'; gyroscope 'none'; picture-in-picture 'none'; microphone 'none'; payment 'none'; sync-xhr 'none; usb 'none'; vr 'none'"

Content-Security-Policy je záludná hlavička. Udává z jakých zdrojů se může načítat obsah. Skripty, styly, obrázky, písmo,… Co nespecifikujete to se nenačte.

Header set Content-Security-Policy "default-src 'self' https://www.ondrejsramek.cz; script-src 'self' 'unsafe-inline' https://ondrejsramek.cz/user/plugins/admin/themes/grav/js/ https://www.google-analytics.com https://srameko.report-uri.io; style-src 'self' 'unsafe-inline' https://www.ondrejsramek.cz https://fonts.googleapis.com; img-src 'self' data: https://www.ondrejsramek.cz https://www.gravatar.com https://www.google-analytics.com https://stats.g.doubleclick.net; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://getgrav.org/; object-src 'none' ; upgrade-insecure-requests; referrer no-referrer-when-downgrade; report-uri https://srameko.report-uri.io/r/default/csp/enforce; report-to https://srameko.report-uri.io/r/default/csp/enforce"

Public-Key-Pins říká prohlížeži jaké jsou hashe certifikátů v řetězu důvěry. Tj. nejen Váš, ale i kořenový a mezilehlý. To pro případ, že by ten Váš přestal platit. Pokud nebudou hashe sedět nepřipojíte se.

Header set Public-Key-Pins 'pin-sha256="pWduCAbO1PxeBmY5QyD300XFYJhIr4xOein6xdQk038="; pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=";pin-sha256="Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys="; includeSubdomains'

Strict-Transport-Security udává počet sekund po jakou se bude stránka načítat přes HTTPs. I kdyby jste chtěli HTTP prohlížeč vynutí HTTPs.

Header set Strict-Transport-Security 'max-age=31536000; includeSubDomains'

Na jaké problémy narazíte? Google Analytics. Pokud používáte ga.js všimněte si, že je možné načítat přes HTTP i HTTPs. Budete muset přidat do CSP domény ssl.google-analytics.com a www.google-analytics.com. Nezapomeňte na to, že Analytics používají i obrázky

script-src https://ssl.google-analytics.com https://www.google-analytics.com; img-src https://www.google-analytics.com https://stats.g.doubleclick.net;

Další komplikací je používání inline zápisu <script> Budete jej muset transformovat do tvaru, tj. vytvořit si externí skript a načítat jej. Začněte také používat SRI (Subresource Integrity). U skriptů, stylů nahrávaných z CDN specifikujete hash. Pokud při načtení stránky nebude sedět nebude použit. CDN Bootstrapu i Cloudflare Vám nabídnou přímo tag i s atributem integrity. Pro vlastní soubory použijte nástroj z webu report-uri.io, který Vám hash vypočítá. Pokud Váš webserver nepodporuje CORS SRI, nepoužívejte prohlížeč (aktuální Firefox, Chrome) by nedokázal ověřit shodu hashů. Když všechno tohle dodržíte odmění Vás securityheaders.io známkou A+

Další související příspěvky:

Zabezpečení DNS

DNS over HTTPs

Animace přehledu AdGuard Home: obecné statistiky, nejčastější klienti, nejdotazovanější a nejčastěji blokované domény
Když už jsem se pustil do generování certifikátu pro UDR, udělal jsem certifikát pro AdGuard Home. Aby DoH fungovalo je potřeba mít wildcard certifikát. Active24 má podporu DNS-01 přes API, takže vydání není žádný problém.
Výhoda DoH je v tom, že HTTPs je už otevřené (administrace...

8th úno 2026