Beveiligingsheaders voor webapplicaties: complete installatiegids
Configureer essentiële beveiligingsheaders voor uw overdrachtsapp. CSP, HSTS, X-Frame-Options tegen veelvoorkomende webaanvallen.
Beveiligingsheaders zijn HTTP-antwoordvelden die browsers vertellen hoe ze het gedrag van een pagina moeten beperken. Voor een bestandsoverdrachtsapp die client-side AES-256-GCM-encryptie uitvoert, zijn zes headers het meest kritisch: Strict-Transport-Security om HTTPS te verplichten, Content-Security-Policy om scriptinjectie te blokkeren, X-Frame-Options om clickjacking te voorkomen, Referrer-Policy om URL-fragmentlekken te stoppen, Permissions-Policy om ongebruikte browser-API's uit te schakelen, en Cross-Origin-Opener-Policy om de browsingcontext te isoleren. Stel je deze goed in, dan blokkeer je 80% van de praktische client-side aanvallen zonder één regel JavaScript te wijzigen.
HSTS en de preloadlijst
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload geeft browsers de opdracht nooit meer via plain HTTP verbinding te maken, voor twee jaar. De preload-directive kwalificeert je voor Chrome's HSTS-preloadlijst op hstspreload.org, die met de browser wordt meegeleverd — zelfs het allereerste verzoek aan je domein gaat over HTTPS, waardoor het initiële MITM-risico verdwijnt. Aanmelding is onomkeerbaar: verwijdering duurt maanden. Test eerst met max-age=300 gedurende een paar dagen. Een bestandsoverdrachtsservice zonder HSTS-preload staat één DNS-kaping verwijderd van het serveren van een nep-uploadformulier.
Content Security Policy die echt werkt
CSP is de moeilijkste header om in te zetten en de meest waardevolle. Een strikte policy voor een bestandsoverdrachtsapp ziet er zo uit: default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; connect-src 'self' https://upload.hexatransfer.com; style-src 'self'; img-src 'self' data:; font-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'. Geen inline scripts, geen eval behalve voor wasm, geen verbindingen naar derden. Verplaats inline event-handlers naar addEventListener in externe bestanden. De 'wasm-unsafe-eval'-waarde is nodig voor libsodium.js; zonder die waarde start Argon2id niet.
Subresource Integrity op elke bundel
Als je JavaScript laadt van een CDN als jsDelivr of unpkg, voeg dan integrity="sha384-..."-attributen toe aan elke script-tag. De browser weigert scripts uit te voeren waarvan de hash niet overeenkomt — een gecompromitteerd CDN kan dan niet stilletjes een backdoored bundel injecteren. Voor zelf-gehoste scripts van je eigen domein is SRI minder kritisch maar nog steeds verdedigbaar. Combineer SRI met een controle in de build-pipeline. HexaTransfer publiceert per release hashes zodat voorzichtige gebruikers handmatig kunnen verifiëren.
X-Frame-Options en frame-ancestors
Clickjacking-aanvallen laden je uploadpagina in een transparante iframe over een andere pagina, waardoor gebruikers onbedoeld op "Versturen" klikken. X-Frame-Options: DENY blokkeert alle framing; de moderne vervanger is Content-Security-Policy: frame-ancestors 'none'. Zet allebei in: oudere browsers respecteren alleen de verouderde header, nieuwere browsers geven de voorkeur aan CSP. Gebruik nooit SAMEORIGIN voor een bestandsoverdrachtsapp; er is geen legitieme reden om de upload-UI in te kapselen vanuit een andere pagina.
Referrer-Policy om fragmentlekken te stoppen
Browsers verwijderen URL-fragmenten — het #sleutel=...-gedeelte waar je ontsleutelingssleutel zit — standaard al uit Referer-headers, maar het padgedeelte lekt nog steeds. Referrer-Policy: no-referrer blokkeert alle refererinformatie: geen Referer-header bij uitgaande links, geen lekken naar andere domeinen, geen URL-fingerprinting door externe trackers. Voor een downloadpagina op /d/7Kj9xQmN2vP8rBwLsE4fT#k=abc voorkomt dit dat de slug naar een extern domein lekt wanneer een gebruiker doorklikte. Stel het site-breed in via de header; vertrouw niet alleen op per-link rel="noreferrer".
Permissions-Policy voor verdediging in de diepte
Gebruikt je app geen camera, microfoon, geolocatie of USB-API, schakel ze dan expliciet uit: Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=(), bluetooth=(), accelerometer=(), magnetometer=(), gyroscope(), payment=(). Een XSS die langs CSP is glipt, kan dan nog steeds de webcam niet inschakelen. Deze header is goedkoop in te zetten, heeft geen UX-impact voor een bestandsoverdrachtsworkflow, en laat aan beveiligingsreviewers zien dat je nagedacht hebt over sandboxing.
Cross-origin-isolatieheaders
Voor toegang tot hoge-resolutietimers en SharedArrayBuffer — soms nodig voor wasm-crypto-implementaties — eisen browsers cross-origin-isolatie via Cross-Origin-Opener-Policy: same-origin en Cross-Origin-Embedder-Policy: require-corp. Deze headers voorkomen ook Spectre-achtige side-channel-aanvallen die AES-sleutels kunnen lekken vanuit aangrenzende origins. Het nadeel: ingesloten bronnen van derden — YouTube-video's, Stripe Checkout — werken niet meer tenzij ze Cross-Origin-Resource-Policy: cross-origin serveren. Voor een enkelvoudige bestandsoverdrachtsapp zonder insluitingen is isolatie gratis.
Cache-Control voor gevoelige pagina's
De downloadbevestigingspagina kan een kortlevende ontsleutelingssleutel of sessietoken tonen. Voorkom caching: Cache-Control: no-store, must-revalidate en Pragma: no-cache. Vertrouw niet alleen op no-cache — dat staat revalidatie tegen de origin toe en betekent dat caching alsnog plaatsvindt. Voor de JavaScript-bundel van de uploadpagina geldt het omgekeerde: lange max-age met inhoudsgehashte bestandsnamen (bijvoorbeeld /js/main-a7b3c9.js), zodat CDN-caching werkt zonder invalidatieproblemen. Pas headers per pad toe.
X-Content-Type-Options en MIME-sniffing
X-Content-Type-Options: nosniff verhindert dat browsers MIME-types raden op basis van de bestandsinhoud. Zonder deze header zou een door een aanvaller geüpload .txt-bestand met <script>-inhoud kunnen worden weergegeven als HTML wanneer het wordt teruggeserverd. Voor een overdrachtsservice die door gebruikers beheerde downloads serveert, combineer nosniff met Content-Disposition: attachment; filename="..." zodat de browser downloadt in plaats van weergeeft. Valideer bestandsnamen server-side op padtraversal (../../../etc/passwd); vertrouw de metadata van de upload nooit voor iets anders dan weergave.
Monitoren met CSP-rapporten
Zet CSP eerst in report-only-modus, verzamel een week lang schendingen op een report-uri-eindpunt, los legitieme problemen op, en schakel dan over naar handhaving. Het rapportage-eindpunt ontvangt JSON-POST's met beschrijvingen van elke schending: geblokkeerde URI, geschonden directive, bronbestand, regelnummer. Services als Report URI of een zelf-gehoste Sentry verzamelen deze. Bekijk ze wekelijks — echte aanvallen zien eruit als ongebruikelijke geblokkeerde URI's die je nog nooit eerder hebt gezien.
Je werk beoordelen
Voer je productie-URL uit via securityheaders.com en Mozilla Observatory. Een A- of A+-beoordeling is geen perfectie, maar het is de minimale lat. De meeste bestandsoverdrachtsservices scoren B of slechter omdat ze Permissions-Policy vergeten of 'unsafe-inline' toestaan in CSP. Een kleine service kan eenvoudig een betere beveiligingsheaderscore behalen dan WeTransfer; de headers kosten niets toe te voegen, en het gesprek met SOC 2-auditors over "waarom is je CSP niet strikt" is aanzienlijk korter wanneer je vanaf het begin strikt bent.
Probeer het op hexatransfer.com — gratis, zonder account, tot 10 GB.
Verstuur grote bestanden veilig met end-to-end-versleuteling
Draag bestanden tot 10 GB gratis over met end-to-end-versleuteling. Geen account nodig. Uw bestanden worden in uw browser versleuteld voordat ze worden geüpload — niemand anders kan ze lezen.
Een bestand verzenden