← TERUG NAAR GIDSEN / WEBSITES

HTTP-beveiligingsheaders uitgelegd: HSTS, CSP en meer

Wat HSTS, CSP, X-Frame-Options, Referrer-Policy en Permissions-Policy doen, welke waarden je gebruikt en waarom ‘controleren’ niet altijd een zwakte is.

Door IPNixaGepubliceerd

De beveiligingsheaders van een website controleren

Wat beveiligingsheaders zijn

Elke HTTP-respons begint met headers: paren van naam en waarde, zoals Content-Type: text/html. Een handvol daarvan verandert hoe de browser de pagina behandelt. Ze kosten niets om te versturen, gelden voor elke bezoeker en worden ingesteld op de server, het hostingplatform of een contentdeliverynetwerk, niet in de HTML van de pagina.

IPNixa stelt zijn eigen headers in via een _headers-bestand dat Cloudflare met elke pagina meestuurt. De controle op deze site vraagt het adres dat je invoert op vanaf onze server, volgt maximaal drie omleidingen en leest de headers van de uiteindelijke respons.

De zes belangrijkste headers

Dit zijn de headers die de controle beoordeelt. De getoonde waarden zijn gangbare, veilige uitgangspunten; pas ze aan aan wat je site nodig heeft.

Header, wat hij voorkomt en een gebruikelijke waarde
HeaderWat hij voorkomtGebruikelijke waarde
Strict-Transport-Security (HSTS)Dat verbindingen na het eerste bezoek worden teruggezet naar gewone HTTPmax-age=31536000; includeSubDomains
Content-Security-Policy (CSP)Dat geïnjecteerde scripts worden uitgevoerd, wat cross-site scripting beperktdefault-src 'self'; script-src 'self'; frame-ancestors 'none'
X-Frame-Options of CSP frame-ancestorsDat andere sites de pagina in een verborgen frame laden (clickjacking)DENY, of frame-ancestors 'none'
X-Content-Type-OptionsDat de browser een bestandstype raadt en gegevens als script uitvoertnosniff
Referrer-PolicyDat volledige paginaadressen, inclusief paden en querystrings, naar andere sites lekkenstrict-origin-when-cross-origin
Permissions-PolicyDat de pagina of ingesloten frames de camera, microfoon of locatie gebruikencamera=(), microphone=(), geolocation=()

Hoe de controle van IPNixa elke header beoordeelt

Elke header krijgt een van drie statussen: aanwezig, controleren of niet opgegeven. Controleren betekent dat de header bestaat, maar dat de waarde niet voldoet aan de regel hieronder; het is een aanleiding om beter te kijken, geen beveiligingsscore.

Wat echte sites sturen: een steekproef

Op 2 november 2026 vroegen we vijf homepages op met dezelfde user agent als de controle en beoordeelden we de responsen met de regels van IPNixa. Headers veranderen vaak, dus zie dit als een momentopname.

Beoordelingen van vijf homepages, 2 november 2026
SiteHSTSCSPFramingnosniffReferrerPermissions
github.comaanwezigcontrolerenaanwezigaanwezigaanwezigniet opgegeven
ipnixa.comaanwezigcontrolerenaanwezigaanwezigaanwezigaanwezig
www.wikipedia.orgaanwezigniet opgegevenniet opgegevenniet opgegevenniet opgegevenniet opgegeven
www.google.comniet opgegevenreport-onlyaanwezigniet opgegevenniet opgegevenniet opgegeven
example.comniet opgegevenniet opgegevenniet opgegevenniet opgegevenniet opgegevenniet opgegeven

De steekproef lezen: controleren is niet hetzelfde als zwak

Het beleid van GitHub beperkt scripts tot de eigen asset-host en specifieke hashes, en dat is streng. Het krijgt alleen ‘controleren’ omdat style-src 'unsafe-inline' toestaat en de regel overal in het beleid naar dat sleutelwoord zoekt. Inline stijlen zijn een veel kleiner risico dan inline scripts, dus dit is eerder een bewuste afweging dan een gat.

Onze eigen site krijgt om een andere reden ‘controleren’: het beleid bevat alleen frame-ancestors 'none', wat framing blokkeert maar scripts niet beperkt. We tonen het resultaat hier zoals het is.

De homepage van Google stuurt het scriptbeleid als Content-Security-Policy-Report-Only, dat overtredingen meldt zonder ze te blokkeren, en stuurde bij deze respons geen HSTS mee; grote sites kunnen HTTPS op andere manieren afdwingen, zoals via preloadlijsten in browsers. De portal van Wikipedia stuurt een zeer lange HSTS-max-age en verder weinig op die pagina. Niets hiervan zegt of deze sites in het algemeen veilig zijn; het laat zien om welke browserbeveiligingen elke respons vraagt.

Headers toevoegen aan je eigen site

Voeg één header tegelijk toe, laad je site opnieuw en controleer of pagina’s, logins, ingesloten video’s en betaalformulieren nog werken voordat je de volgende toevoegt.

  1. Begin met de headers met weinig risico: X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin en X-Frame-Options: DENY, tenzij je pagina’s door een andere site in een frame geladen moeten kunnen worden.
  2. Voeg HSTS toe met een korte max-age, zoals 300, controleer of elk subdomein via HTTPS werkt en verhoog de waarde dan naar 31536000. Voeg includeSubDomains alleen toe als alle subdomeinen HTTPS ondersteunen.
  3. Schrijf een Content-Security-Policy en stuur die eerst als Content-Security-Policy-Report-Only. Verzamel meldingen van overtredingen of kijk in de browserconsole, herstel of sta de legitieme bronnen toe en schakel dan over op de afdwingende header.
  4. Voeg een Permissions-Policy toe met de krachtige functies die je niet gebruikt, bijvoorbeeld camera=(), microphone=(), geolocation=().
  5. Gebruik op nginx add_header met de vlag always, op Apache Header always set, en bij statische hosting of een CDN het headersbestand of de regels voor responsheaders van het platform.
  6. Voer de headercontrole van IPNixa opnieuw uit. Voor elke ontbrekende header toont die een kopieerklare regel voor nginx, Apache of een _headers-bestand.

HSTS-preload en andere aandachtspunten

HSTS-preloadlijsten zijn in browsers ingebouwd, zodat zelfs het allereerste bezoek HTTPS gebruikt. Voor aanmelding van een domein zijn een max-age van minimaal een jaar, includeSubDomains en de preload-richtlijn vereist, en het duurt maanden voordat een verwijdering gebruikers bereikt. Meld je domein alleen aan als elk subdomein, ook interne, op HTTPS blijft.

X-XSS-Protection is verouderd; moderne browsers negeren de header en CSP vervangt hem. De headers voor cross-origin-isolatie (Cross-Origin-Opener-Policy, Cross-Origin-Embedder-Policy en Cross-Origin-Resource-Policy) worden door de controle niet beoordeeld, omdat alleen sites die functies zoals gedeeld geheugen gebruiken ze nodig hebben en ze ingesloten inhoud van derden kunnen blokkeren.

Veelgestelde vragen

Betekent een ontbrekende header dat een site onveilig is?

Nee. Headers voegen aan de kant van de browser bescherming toe tegen specifieke aanvallen. Een site zonder deze headers kan nog steeds goed beheerd zijn, en een site met alle headers kan nog andere zwakke plekken hebben. Gebruik het resultaat als checklist voor de eigenaar van de site, niet als oordeel voor bezoekers.

Waarom toont mijn browser headers die de controle niet zag?

Sites kunnen headers laten verschillen per pagina, per land, per inlogstatus of per CDN-locatie. De controle leest één respons voor het adres dat je invoert, opgehaald via het netwerk van Cloudflare zonder cookies.

Gebruik ik X-Frame-Options of frame-ancestors?

frame-ancestors in CSP is de moderne instelling en kan specifieke sites toestaan. Als je daarnaast X-Frame-Options stuurt, blijven oudere browsers ook beschermd; zijn beide aanwezig, dan volgen huidige browsers frame-ancestors.

Kan ik een pagina controleren waarvoor je moet inloggen?

Nee. De controle stuurt geen cookies of inloggegevens mee en weigert privé- en lokale adressen. Kopieer voor pagina’s achter een login of in een privénetwerk de ruwe responsheaders uit de ontwikkelaarstools van je browser of uit curl -I en plak ze in de controle; geplakte headers worden in je browser geanalyseerd.

Bronnen en meer informatie