Sécurité

HTTP beveiligingsheaders: de complete gids

Beveilig uw website met HTTP security headers. HSTS, CSP, X-Frame-Options en meer — uitleg en configuratie.

5 mars 20253 min de lectureWarDek Team

Wat zijn security headers?

HTTP security headers zijn instructies die uw webserver meestuurt bij elke response. Ze vertellen de browser hoe uw website moet worden behandeld op het gebied van beveiliging. Het zijn eenvoudige configuraties die aanzienlijke bescherming bieden tegen veelvoorkomende aanvallen.

Het goede nieuws: de meeste security headers zijn binnen minuten te implementeren en kosten niets. Het slechte nieuws: bij meer dan 70% van de Nederlandse websites ontbreken een of meer essentiële headers.

De essentiële headers

1. Strict-Transport-Security (HSTS)

Bescherming tegen: downgrade-aanvallen, SSL-stripping, man-in-the-middle

HSTS forceert de browser om alleen via HTTPS te communiceren met uw server. Zelfs als een gebruiker http:// typt, schakelt de browser automatisch over naar HTTPS.

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

| Parameter | Betekenis | |---|---| | max-age=63072000 | 2 jaar geldig (in seconden) | | includeSubDomains | Geldt ook voor subdomeinen | | preload | Verzoek opname in browser preload-lijst |

Aandachtspunt: activeer HSTS pas nadat u zeker weet dat HTTPS correct werkt op alle (sub)domeinen. Eenmaal in de preload-lijst is het lastig om eruit te komen.

2. Content-Security-Policy (CSP)

Bescherming tegen: XSS (cross-site scripting), code-injectie, data-exfiltratie

CSP definieert welke bronnen de browser mag laden. Het is de krachtigste security header, maar ook de meest complexe om te configureren.

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none';

Tip: begin met Content-Security-Policy-Report-Only om te monitoren zonder te blokkeren. Analyseer de reports en verfijn het beleid voordat u het afdwingt.

3. X-Content-Type-Options

Bescherming tegen: MIME-sniffing aanvallen

Voorkomt dat de browser het Content-Type van een response probeert te raden. Zonder deze header kan een aanvaller een JavaScript-bestand uploaden als afbeelding.

X-Content-Type-Options: nosniff

Eenvoudig, effectief, geen bijwerkingen. Altijd instellen.

4. X-Frame-Options

Bescherming tegen: clickjacking

Bepaalt of uw website in een iframe mag worden geladen door andere websites.

X-Frame-Options: DENY

| Waarde | Betekenis | |---|---| | DENY | Nooit in iframe laden (veiligst) | | SAMEORIGIN | Alleen door dezelfde origin |

Opmerking: deze header wordt langzaam vervangen door CSP's frame-ancestors directive. Stel beide in voor maximale compatibiliteit.

5. Referrer-Policy

Bescherming tegen: onbedoelde doorgifte van URL-informatie

Bepaalt hoeveel referrer-informatie wordt meegezonden bij navigatie naar andere sites.

Referrer-Policy: strict-origin-when-cross-origin

| Waarde | Effect | |---|---| | no-referrer | Stuur nooit referrer | | strict-origin-when-cross-origin | Volledige URL intern, alleen origin extern | | same-origin | Alleen referrer bij interne navigatie |

6. Permissions-Policy

Bescherming tegen: misbruik van browser-API's

Beperkt welke browser-functies uw website mag gebruiken (camera, microfoon, geolocatie, etc.).

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

De lege haakjes () betekenen: deze functie is voor niemand beschikbaar. Als u een specifieke functie nodig heeft:

Permissions-Policy: camera=(self), geolocation=(self "https://maps.example.com")

7. X-XSS-Protection

X-XSS-Protection: 0

Let op: stel deze header in op 0. De legacy XSS-filter van browsers veroorzaakt meer problemen dan het oplost. Gebruik CSP voor XSS-bescherming.

Configuratievoorbeelden

Nginx

server {
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'none';" 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;
    add_header X-XSS-Protection "0" always;
}

Apache

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set Content-Security-Policy "default-src 'self'; frame-ancestors 'none';"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set X-XSS-Protection "0"

Next.js / Vercel

// next.config.js
const securityHeaders = [
  { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'X-Frame-Options', value: 'DENY' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
  { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
];

module.exports = {
  async headers() {
    return [{ source: '/(.*)', headers: securityHeaders }];
  },
};

Veelgemaakte fouten

| Fout | Gevolg | |---|---| | HSTS zonder geldige HTTPS op alle subdomeinen | Subdomeinen onbereikbaar | | CSP te restrictief zonder testen | Website-functionaliteit kapot | | X-Frame-Options: ALLOW-FROM | Niet ondersteund in moderne browsers | | Geen always in nginx add_header | Headers ontbreken bij foutpagina's | | Alleen security headers op homepage | Andere pagina's onbeschermd |

Headers verwijderen die informatie lekken

Naast het toevoegen van beveiligingsheaders is het belangrijk om headers te verwijderen die onnodige informatie over uw server blootgeven:

# Nginx — verberg serverversie
server_tokens off;
// Express.js — verwijder X-Powered-By
app.disable('x-powered-by');

Headers zoals Server: nginx/1.24.0, X-Powered-By: Express en X-AspNet-Version geven aanvallers waardevolle informatie over uw technologie-stack. Verwijder deze altijd in productie.

Hoe test u uw headers?

U kunt uw security headers controleren met online tools of via de browser Developer Tools (tabblad Network > Response Headers). Een geautomatiseerde scan geeft u direct inzicht in ontbrekende of verkeerd geconfigureerde headers.

In Nederland adviseert het NCSC (Nationaal Cyber Security Centrum) expliciet het gebruik van beveiligingsheaders als onderdeel van de basisbeveiligingsmaatregelen voor webapplicaties. Het Digital Trust Center biedt aanvullende richtlijnen voor het MKB.

Scan uw website gratis met WarDek — OWASP, NIS2, AVG, AI Act compliance in één scan.

#security headers#HSTS#CSP#beveiliging

Scannez votre site gratuitement

WarDek détecte les vulnérabilités mentionnées dans cet article en quelques secondes.

Retour à Sécurité