Security headers: HSTS, CSP, X-Frame-Options en andere
· 7 min lezen
Kort: Security HTTP-headers zijn regels die de server aan elke HTTP-respons toevoegt om de browser te vertellen hoe je site moet worden behandeld. Correct ingesteld elimineren ze hele klassen aanvallen (XSS, clickjacking, MITM) - en zijn gratis.
Kort: Security HTTP-headers zijn regels die de server aan elke HTTP-respons toevoegt om de browser te vertellen hoe je site moet worden behandeld. Correct ingesteld elimineren ze hele klassen aanvallen (XSS, clickjacking, MITM) - en zijn gratis.
Waarom ze ertoe doen
Een applicatie kan backend-side perfect veilig zijn, maar zonder juiste headers nog steeds kwetsbaar voor browser-side aanvallen: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. Security headers verplaatsen de verdediging naar de browser.
Strict-Transport-Security (HSTS)
Dwingt HTTPS af voor alle toekomstige bezoeken. Na het eerste HTTPS-bezoek onthoudt de browser het domein en herschrijft zelf elke http://-link naar https://, zelfs als de gebruiker op een slecht antwoord klikt.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age=63072000= geldig 2 jaarincludeSubDomains= de regel geldt ook voor alle subdomeinen (let op: als je een HTTP-only subdomein hebt, breekt het)preload= maakt opname mogelijk in de HSTS preload-lijst ingebouwd in Chrome / Firefox / Safari
Let op:
HSTS met preload duurt 6+ maanden om uit de lijst te verwijderen. Voeg preload niet toe voordat je verifieert dat HTTPS stabiel werkt voor alle subdomeinen.
Content-Security-Policy (CSP)
De krachtigste maar ook moeilijkst in te stellen header. Whitelist van waar de browser scripts, stijlen, afbeeldingen, iframes mag laden. Zonder CSP kan een aanvaller die een <script>-tag kan injecteren willekeurige JS uitvoeren - met CSP alleen code uit goedgekeurde bronnen.
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
Gangbare directives:
default-src 'self'= als default sta alleen resources van mijn domein toescript-src= JS-bronnen (specificeer hash of nonce voor inline scripts)style-src= CSS-bronnenimg-src= afbeeldingenconnect-src= AJAX, WebSocket, EventSourceframe-ancestors 'none'= niemand mag de pagina in iframe embedden (beter dan X-Frame-Options)report-uri /csp-report= browser stuurt JSON bij elke schending (jij vangt op in backend en logt)
X-Frame-Options
Ouder alternatief voor frame-ancestors. Voorkomt clickjacking - aanvaller plaatst je pagina als iframe en bedekt met onzichtbare knoppen.
X-Frame-Options: DENY
Waarden: DENY (niemand), SAMEORIGIN (alleen mijn domein), ALLOW-FROM uri (deprecated).
X-Content-Type-Options
X-Content-Type-Options: nosniff
Schakelt MIME sniffing uit - de browser respecteert de Content-Type die de server retourneerde. Zonder dit kan een aanvaller een bestand met verkeerd type uploaden (bijv. een afbeelding die eigenlijk HTML met script is) en de browser kan het als web page uitvoeren.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Bestuurt hoeveel informatie over de vorige pagina de browser in de Referer-header verzendt bij klikken. De default in moderne browsers is al strict-origin-when-cross-origin, maar de expliciete declaratieve header verzekert consistentie.
Permissions-Policy
Schakelt API's uit die je niet nodig hebt - camera, microfoon, GPS, geolocation. Een aanvaller via XSS kan deze API's niet aanvragen.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Praktische nginx-configuratie
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP is uitgebreid - definieer volgens je applicatie
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}
De sleutel is always - zonder dat laat nginx headers weg bij error responses (4xx, 5xx).
Audit van huidige staat
Het eenvoudigst via online tool. Onze header check zal je tonen welke headers ontbreken en welke fout zijn. Voor grondige audit geeft ook securityheaders.com een A-F score.
Conclusie
Security headers zijn een van de beste investeringen in verhouding inspanning tot winst op security-gebied - typisch een half uur setup in reverse proxy tegen een hele categorie browser-side aanvallen. Audit eenmaal per halfjaar als onderdeel van regulier onderhoud is redelijk minimum.
Gratis security headers audit
Zonder registratie, resultaat in drie seconden.
Probeer ePulz.io gratis - 7 dagen zonder creditcard.
Account aanmaken