Hoe deze controle werkt
Scanaris leest de headers van het hoofdantwoord van je pagina en kijkt naar twee in het bijzonder. Staat X-Powered-By erin met welke waarde dan ook (bijvoorbeeld Express, PHP/8.2.12 of Next.js), dan opent hij een bevinding met lage ernst. Staat Server erin en bevat de waarde een versienummer (iets als nginx/1.18.0 of Apache/2.4.57), dan opent hij er nog een. Een kale Server: nginx of Server: cloudflare wordt niet gemeld: zeggen welke server je gebruikt is geen probleem; zeggen welke versie precies, wel.
Waarom dit belangrijk is
Geen van beide headers doet iets voor de gebruiker of de browser. Ze bestaan uit gewoonte. Wat ze wel doen, is werk besparen voor wie een kwetsbaarheid zoekt: met PHP/7.4.3 of Apache/2.4.49 in het antwoord hoeft de aanvaller niets te raden, hij gaat rechtstreeks naar de lijst met bekende fouten van die versie en probeert die met een publieke exploit. Het is een bevinding met lage ernst omdat het op zichzelf geen deur opent; maar het is een van de makkelijkste om te sluiten, en massascanners filteren hun doelwitten precies op deze headers.
Hoe je ze verwijdert, per stack
- Express:
app.disable('x-powered-by')bij het aanmaken van de app, of gebruikhelmet(), dat hem samen met andere verhardingen verwijdert. - Next.js: stuurt standaard
X-Powered-By: Next.js. Innext.config.js:poweredByHeader: false. - PHP: in
php.ini,expose_php = Off. Bij shared hosting kan dit meestal via het paneel of met een.user.ini. - ASP.NET: in
web.config, binnencustomHeaders,<remove name="X-Powered-By" />, en in IIS schakel je ook de headerX-AspNet-Versionuit metenableVersionHeader="false". - nginx:
server_tokens off;in hethttp-blok. Het zegt nog steeds "nginx", maar zonder versie. - Apache:
ServerTokens ProdenServerSignature Offin de hoofdconfiguratie. MetProdwordt de header gewoonApache. - Vercel, Netlify, Cloudflare Pages: sturen geen versie in
Server. Zie je daarX-Powered-By, dan komt dat van je framework (Next.js of Express), niet van het platform.
Heb je een proxy of CDN ervoor (Cloudflare, een load balancer), controleer dan het openbare antwoord: soms vervangt de proxy de Server-header en verdwijnt het probleem vanzelf, maar X-Powered-By gaat er meestal ongewijzigd doorheen.
Controleer of het opgelost is
curl -sI https://jouwdomein.nl | grep -iE "^(server|x-powered-by):"
Ideaal is dat X-Powered-By niet verschijnt en dat Server, als hij verschijnt, geen nummer bevat. Probeer ook een API-route of een foutpagina (een URL die niet bestaat): fouten worden soms in een andere laag gegenereerd die de header weer toevoegt.
Veelgestelde vragen
De versie verbergen lost de kwetsbaarheid niet op. Wat is het nut?
Niet op de eerste resultatenpagina staan van wie slachtoffers zoekt. Je hebt gelijk dat de echte oplossing updaten is: de versie verbergen is de aanvulling, niet de vervanging. Beide samen kosten vijf minuten.
Mijn hoster laat me de serverconfiguratie niet aanpassen.
Verwijder dan in elk geval X-Powered-By vanuit je code of je .htaccess (Header unset X-Powered-By) en vraag de hoster de versie te verbergen. De andere beveiligingsheaders, die je wel moet hebben, worden nagekeken door de controle beveiligingsheaders.
Waarom wordt "Server: cloudflare" niet gemeld?
Omdat het niets bruikbaars onthult: geen versie en geen specifieke software erachter. Waar deze controle naar zoekt, is informatie die de weg naar een exploit verkort. Welke headers de moeite waard zijn en welke alleen ruis, staat in HTTP-headers uitgelegd voor mensen.