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+