02 — Werkwijze
Werkwijze: hoe we meten
Vierentwintig controles, elk met een vaste drempel en een bron. Kunnen we iets niet meten, dan zeggen we dat, en dan telt het niet mee.
Wat we wel en niet opvragen
Bij een scan doet de scanner wat een browser bij een eerste bezoek ook doet, en een paar DNS-opvragingen. Hij vraagt https:// en http:// van je domein op en volgt hooguit vijf doorverwijzingen. Bij elke doorverwijzing controleert hij opnieuw dat het adres een openbare website is. Hij leest van elke pagina ten hoogste de eerste twee megabyte, en stopt na vijfentwintig seconden. Daarnaast vraagt hij de TXT-records op van je domein en van _dmarc. voor je domein. Begint je adres met www., dan controleren we SPF en DMARC op het domein zonder www..
We scannen geen IP-adressen, geen interne of gereserveerde namen (zoals .local of localhost) en geen andere poorten dan de gewone webpoorten. Ook een naam die naar een intern netwerkadres wijst, weigeren we. Zo kan niemand de scanner gebruiken om in een netwerk te kijken waar hij niet hoort.
Waarom drempels en geen score
Een score van 73 uit 100 zegt niets over wat je moet doen. Een drempel wel: HSTS korter dan een jaar is een advies, een certificaat dat verlopen is is afkeur. Elke drempel hierboven komt uit een bron die je zelf kunt nalezen. Waar een drempel onze eigen keuze is, zoals de 14 dagen voor een certificaat of de 90 dagen voor PHP, staat dat bij de controle zelf in de uitslag.
Hoe de tabellen actueel blijven
Twee dingen veranderen in de loop van de tijd. De nieuwste WordPress-versie halen we bij elke scan op bij api.wordpress.org en onthouden we hooguit zes uur. De PHP-tabel lezen we met de hand van php.net, en hij heeft een herzieningsdatum. Is die datum voorbij zonder dat de tabel is bijgewerkt, dan geeft de scanner bij PHP niet gemeten. Een verouderde tabel levert dus geen verkeerd oordeel op.
Deze pagina is opgesteld met hulp van een AI-model. De drempels staan zo in de code van de scanner, en de voorbeeldentabel test ze.
Het oordeel
Eén woord, en elk punt los
Het oordeel bovenaan de uitslag volgt uit de punten eronder, zonder weging en zonder score. Afgekeurd betekent dat minstens één punt afkeur kreeg. Goedgekeurd met advies betekent: geen afkeur, wel adviezen. Goedgekeurd betekent dat alles wat we konden meten in orde is.
Punten die we niet konden meten, of die niet bij je site horen, tellen niet mee. Hoeveel dat er zijn, staat direct onder het oordeel. Een site waarvan we de homepage niet konden lezen, krijgt helemaal geen oordeel. Dan zie je geen uitslag, met de reden erbij.
Alle controles en hun drempels
Wat we per punt bekijken, wanneer het in orde is, wanneer het een advies of afkeur wordt, en waar de drempel vandaan komt.
| Controle | In orde | Advies | Afkeur | Bron |
|---|---|---|---|---|
| Cookies vóór toestemming | Geen cookies, of alleen cookies die niet van een bekend trackingproduct zijn | — | Een tracking-cookie (zoals _ga, _fbp, _hj…) bij het eerste bezoek | Telecommunicatiewet art. 11.7a |
| Trackers die direct laden | Geen trackerscript dat direct laadt; een script met type="text/plain" telt niet | Een script of pixel van een bekende analyse- of advertentiedienst laadt direct | — | Telecommunicatiewet art. 11.7a |
| Externe bronnen | Alles van je eigen domein of subdomeinen | Lettertypes, scripts, stylesheets, iframes of plaatjes van een ander domein | — | AVG |
| Privacyverklaring | Een link met 'privacy' in adres of tekst op de homepage | Geen zo'n link gevonden | — | AVG art. 13 |
| HTTPS | Antwoordt over https met een geldig certificaat | — | Geen https, of een ongeldig certificaat | internet.nl |
| Doorsturen naar HTTPS | http:// stuurt direct door naar https://, of poort 80 is dicht | Eerst naar een andere http-pagina, pas daarna naar https | http:// antwoordt zelf, of komt nooit op https uit | internet.nl |
| Geldigheid certificaat | 14 dagen of meer te gaan | Minder dan 14 dagen | Verlopen | internet.nl |
| HSTS | max-age van minstens 31.536.000 seconden (een jaar) | Korter dan een jaar | Ontbreekt, of max-age=0 | RFC 6797, hstspreload.org |
| Gemengde inhoud | Niets via http:// op een https-pagina | Een plaatje via http:// | Een script, stylesheet of iframe via http:// | MDN |
| X-Content-Type-Options | nosniff | Ontbreekt of andere waarde | — | MDN, internet.nl |
| X-Frame-Options | DENY of SAMEORIGIN, of CSP frame-ancestors | Ontbreekt | — | MDN, internet.nl |
| Content-Security-Policy | Aanwezig | Ontbreekt | — | MDN, internet.nl |
| Referrer-Policy | no-referrer, same-origin, strict-origin(-when-cross-origin), origin(-when-cross-origin) | Ontbreekt, of unsafe-url / no-referrer-when-downgrade | — | MDN, internet.nl |
| Softwareversies zichtbaar | Server en X-Powered-By noemen geen versienummer | Er staat een versienummer in | — | OWASP Secure Headers |
| WordPress-versie | De nieuwste versie volgens api.wordpress.org | Nieuwer dan de laatste uitgave (test- of ontwikkelversie) | Ouder dan de nieuwste | api.wordpress.org, bij elke scan |
| PHP-versie | Reeks met nog 90 dagen of meer beveiligingsupdates | Minder dan 90 dagen te gaan | Reeks zonder beveiligingsupdates | php.net |
| SPF | Eén record dat eindigt op -all of ~all | Eindigt op ?all, of zonder all | Geen record, meer dan één, of +all | RFC 7208, internet.nl |
| DMARC | p=quarantine of p=reject | p=none | Geen record, meer dan één, of geen geldig beleid | RFC 7489, internet.nl |
| Taal van de pagina | lang op <html> | — | Ontbreekt | WCAG 2.2 sc. 3.1.1 |
| Paginatitel | Een niet-lege <title> | — | Ontbreekt of leeg | WCAG 2.2 sc. 2.4.2 |
| Alt-teksten | Elke <img> heeft een alt-attribuut (alt="" mag) | — | Eén of meer zonder | WCAG 2.2 sc. 1.1.1 |
| Inzoomen | Niet beperkt | — | user-scalable=no, of maximum-scale onder 2 | WCAG 2.2 sc. 1.4.4 |
| Hoofdkop | Minstens één <h1> | Geen <h1> | — | WCAG 2.2 sc. 1.3.1 |
| Labels bij invulvelden | Elk veld heeft een label, aria-label of title | Een of meer velden zonder | — | WCAG 2.2 sc. 3.3.2 |
Bron: php.net/supported-versions.php (gelezen 17 oktober 2026); api.wordpress.org/core/version-check (bij elke scan); RFC 6797, 7208 en 7489 (rfc-editor.org); WCAG 2.2 (w3.org); internet.nl; MDN Web Docs; Telecommunicatiewet (wetten.overheid.nl).
De PHP-tabel
Tot wanneer krijgt elke PHP-reeks beveiligingsupdates? Elke reeks ouder dan 8.2 krijgt ze niet meer.
| PHP-reeks | Beveiligingsupdates tot |
|---|---|
| 8.2 | 31 december 2026 |
| 8.3 | 31 december 2027 |
| 8.4 | 31 december 2028 |
| 8.5 | 31 december 2029 |
Bron: php.net — Supported Versions, https://www.php.net/supported-versions.php
Vragen over de werkwijze
Waarom kijken jullie alleen naar de homepage?
Omdat de scan snel en voorspelbaar moet zijn en de site die je scant niet mag belasten. De homepage laat het meeste zien: de headers van de server, de cookies bij een eerste bezoek, de trackers en het thema. Een volledige crawl is iets anders, en dat zou ook een andere belofte zijn.
Waarom voeren jullie geen JavaScript uit?
Een browser in de scanner zou hem trager, duurder en minder voorspelbaar maken. Daarom zeggen we er eerlijk bij wat we daardoor missen: cookies die pas door JavaScript worden gezet. De trackercontrole vangt het grootste deel daarvan op, omdat het script van die trackers in de HTML staat.
Waarom geen DKIM?
Voor DKIM heb je de selector nodig, en die staat alleen in de header van een echt verstuurde mail. Die hebben we niet, dus controleren we DKIM niet. Je ziet hem daarom ook niet als 'niet gemeten' in de uitslag, want het is geen punt dat we soms wel kunnen meten.
Bewaren jullie wat ik invul?
Nee. Het adres bestaat alleen zolang de scan duurt. We bewaren alleen tijdstippen, zonder adres, om te voorkomen dat iemand de scanner gebruikt om andermans server te overbelasten. Daarnaast onthouden we de nieuwste WordPress-versie zes uur lang, zodat we api.wordpress.org niet bij elke scan hoeven te vragen.
Probeer het op je eigen site
Of bekijk eerst hoe de scanner zich gedraagt in de lastige gevallen.