Hoe deze controle werkt
Scanaris vraagt /.well-known/security.txt op, de standaardlocatie uit RFC 9116, en als die er niet is, probeert hij /security.txt in de root, de oude locatie. Hij telt het bestand alleen als aanwezig als het 200 antwoordt en een regel bevat die begint met Contact:, het enige verplichte veld naast Expires. Dat sluit single-page apps uit die voor elk pad hun HTML teruggeven. Vindt hij het niet, dan opent hij een informatieve bevinding: het kost je geen punten, omdat het ontbreken geen beveiligingsfout is; het is een goede gewoonte die je mist.
Waar het voor dient
Wanneer iemand een fout in je site vindt (een onderzoeker, een nieuwsgierige gebruiker, een ander bedrijf), moet hij weten aan wie hij het moet melden. Zonder duidelijk kanaal is het gebruikelijke gevolg dat hij het niet meldt, of het publiceert, of naar het algemene contactformulier schrijft dat niemand leest. security.txt is een tekstbestand op een bekend pad waar je zegt "schrijf me hier, in deze taal, en dit is mijn beleid". Mensen en tools lezen het, en steeds meer bug-bountyprogramma's en verzekeraars nemen het als vanzelfsprekend aan. Het beschermt ook jou: het maakt duidelijk dat je verantwoorde meldingen accepteert en onder welke voorwaarden.
Hoe je het aanmaakt
Een minimaal geldig bestand:
Contact: mailto:security@jouwdomein.nl
Expires: 2027-10-01T00:00:00.000Z
Preferred-Languages: nl, en
Canonical: https://jouwdomein.nl/.well-known/security.txt
- Contact (verplicht): een
mailto:, een formulier-URL of eentel:. Je mag er meerdere opgeven, in volgorde van voorkeur. De mailbox moet bestaan en gelezen worden. - Expires (verplicht): datum in ISO 8601-formaat waarna het bestand niet meer geldig is. De RFC raadt minder dan een jaar aan: zet een herinnering om het te vernieuwen.
- Preferred-Languages, Policy (URL van je disclosurebeleid), Encryption (je PGP-sleutel) en Acknowledgments (een bedankpagina) zijn optioneel.
- Canonical geeft de officiële URL van het bestand aan; handig als je het bestand met PGP ondertekent zodat niemand een vals exemplaar kan publiceren.
Waar je het neerzet
- Nuxt, Next.js, Vite, Astro: maak
public/.well-known/security.txt; het wordt ongewijzigd geserveerd. Controleer dat je.gitignoregeen mappen negeert die met een punt beginnen. - Vercel en Netlify: hetzelfde, in de openbare map van het project.
- nginx of Apache: een bestand op
/.well-known/security.txtin de geserveerde map; als je applicatie alle routes afvangt, voeg dan een uitzondering toe voor/.well-known/. - WordPress: upload het bestand via FTP naar
.well-known/in de root, of gebruik een plugin die het genereert.
Serveer het als text/plain en over HTTPS. Heb je veel domeinen, dan heeft elk zijn eigen bestand nodig of moet het doorverwijzen naar het canonieke.
Controleer of het opgelost is
curl -si https://jouwdomein.nl/.well-known/security.txt | grep -iE "^(HTTP|content-type|contact|expires)"
Verwacht: 200, type text/plain, een regel Contact: en een regel Expires: met een datum in de toekomst.
Veelgestelde vragen
Krijg ik dan meer spam of mails van "premiejagers"?
Er komt wat post van lage kwaliteit binnen; dat is de prijs van bereikbaar zijn. Een eenvoudig filter en een duidelijk beleid (wat telt als geldige melding, of je betaalt of niet) beperken de ruis. Wat het je bespaart, is het alternatief: het via Twitter te weten komen.
Kan ik gewoon naar het algemene contactformulier verwijzen?
Dat kan, maar een eigen mailbox die iemand nakijkt is beter. Als marketing het algemene formulier leest, kan een kwetsbaarheidsmelding weken onderweg zijn naar de juiste persoon.
Waarom telt het niet mee voor het cijfer?
Omdat het voorbereiding meet, geen blootstelling. De andere beveiligingscontroles, die wel meetellen, staan in de beveiligingschecklist vóór de lancering.