Beveiligingsheaders op je website instellen

Om bezoekers van je website te beschermen tegen mogelijke hacks en XSS-aanvallen adviseert NederHost om, indien mogelijk, een aantal beveiligingsheaders in te stellen op je website. Deze headers bieden geen volledige bescherming maar kunnen wel helpen bij het voorkomen van schade.

De opties

Openen in een frame verbieden

Met de header X-Frame-Options geef je aan of je website in een frame mag worden geopend. De geadviseerde waarden voor deze header zijn:

  • DENY (niet toestaan, de beste waarde als je zelf geen frames gebruikt)
  • SAMEORIGIN (alleen toestaan vanaf je eigen website)

Het raden naar bestandstypen uitschakelen

Normaliter stuurt je website bij ieder bestand een beschrijving mee van het bestandstype (het mime-type). Op ouderwetse of minder goed geconfigureerde applicaties klopt dit bestandstype niet altijd, waardoor browsers ook de mogelijkheid hebben om het bestandstype te raden. Dit geeft echter een mogelijk veiligheidsrisico doordat bijvoorbeeld uploads als Javascript kunnen worden ingeladen. Je schakelt het raden naar bestandstypen uit met de header X-Content-Type-Options die als enige geldige waarde nosniff heeft.

Geen 'Referer'-header meesturen

Als er vanaf je website een link naar een andere website wordt gevolgd dan stuurt de browser van je bezoekers standaard een Referer-header mee. Met deze header kan de website waar de link naartoe leidt zien vanaf welke pagina jouw bezoeker komt. Hierdoor kan ongewenst informatie lekken.

Door het instellen van de header Referrer-Policy kun je voorkomen dat mogelijk gevoelige informatie uit de URL wordt doorgestuurd naar een andere website. De geadviseerde waarden voor deze header zijn:

  • no-referrer (stuur geen referrer)
  • same-origin (stuur alleen de referrer naar je eigen website)
  • strict-origin (stuur alleen het deel t/m de domeinnaam naar een andere website, mits de communicatie via een net zo veilig protocol verloopt)
  • strict-origin-when-cross-origin (een combinatie van 'same-origin' en 'strict-origin')
  • origin-when-cross-origin (een combinatie van 'same-origin' en 'origin', wat betekent dat het deel t/m de domeinnaam ook wordt doorgestuurd bij een link naar een website zonder HTTPS)

Merk op dat 'Referer' een spelfout voor 'referrer' is die sinds 1996 de officiële term is in de HTTP-standaard. De spelling van de beveilingsheader is 'Referrer-Policy' wat wel correct gespeld en dus inconsequent is.

Strict transport security instellen

Met het instellen van HTTP Strict Transport Security (HSTS) voorkom je dat bezoekers van je website de website onbedoeld via een onversleutelde verbinding opvragen. Als je HSTS instelt dan geeft je website aan de bezoeker aan dat deze gedurende een bepaalde periode altijd via HTTPS moet worden benaderd. Je maakt daarmee een eventuele man-in-the-middle-aanval veel lastiger.

Het configureren van HSTS betekent ook dat je verplicht bent je website via HTTPS beschikbaar te houden; als je HTTPS uit zou schakelen na het instellen van HSTS dan is je website gedurende enige tijd onbereikbaar voor een deel van je bezoekers.

De HSTS-header geeft aan hoelang de verplichting om HTTPS te gebruiken geldig is, gemeten vanaf de laatste keer dat een bezoeker je website bezocht. Als je wilt testen met HSTS dan kun je hiervoor een korte periode gebruiken, maar als je HSTS echt zinvol wilt toepassen dan wordt geadviseerd om HSTS steeds voor een periode van een jaar in te schakelen.

HSTS schakel je eenvoudig in vanuit Mijn NederHost (bij de HTTPS-instellingen van je website) of je voegt zelf een header Strict-Transport-Security toe met een waarde van bijvoorbeeld "max-age=31536000" (dat zijn 365 maal 24 maal 60 maal 60 seconden, oftewel een jaar, en de aanhalingstekens zijn verplicht).

Een content security policy instellen

Een moderne header die veel XSS-aanvallen zou moeten blokkeren is Content-Security-Policy. Via deze header regel je o.a. het openen van je website in frames, het ophalen van content via enkel HTTPS en het insturen van formulieren naar de juiste website. Een content security policy bestaat uit meerdere directives en het instellen hiervan is wat complexer dan andere beveiligingsheaders.

Als je deze header in wilt stellen op je website dan adviseert NederHost je om eerst uitgebreid te testen met de header Content-Security-Policy-Report-Only; die header blokkeert niets maar geeft foutmeldingen in de console van je browser. Pas als je hebt vastgesteld dat je website correct werkt met de door jou ingestelde policy dan stel je Content-Security-Policy in.

Een startpunt voor deze header zou kunnen zijn:

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

Zie voor meer informatie over het instellen van een content security policy de documentatie van Mozilla over deze header.

Voorbeeldconfiguratie

De HSTS-header kun je instellen vanuit Mijn NederHost en veel van de andere headers worden waarschijnlijk door je CMS al gegenereerd. Als je de headers toch zelf wilt instellen vanuit .htaccess dan kan dat natuurlijk ook. Een voorbeeldconfiguratie die je in .htaccess kunt plaatsen is:

Header set Strict-Transport-Security "max-age=31536000"
Header set X-Frame-Options SAMEORIGIN
Header set X-Content-Type-Options nosniff
Header set Referrer-Policy strict-origin-when-cross-origin
# Header Set Content-Security-Policy default-src 'self'; form-action 'self'

Als je niet uitgebreid wilt testen dan kun je Content-Security-Policy achterwege laten, daarom is deze header in bovenstaand voorbeeld uitgeschakeld. De andere headers zijn echter met de hier gebruikte waarden over het algemeen veilig in te stellen.