Ga naar inhoud
HexaTransfer
Terug naar blog
Encryptie & beveiliging

Veilig links delen best practices: bescherm uw download-URL's

Best practices voor veilige downloadlinks. URL-tokenbeveiliging, linkvervaltijden en downloadlimieten.

Een veilige downloadlink behandelt de URL zelf als onderdeel van de sleutel. Het gedeelte na de slash moet minimaal 128 bits entropie hebben (denk aan hexatransfer.com/d/7Kj9xQmN2vP8rBwLsE4fT), in uren verlopen in plaats van dagen, maximaal één of twee downloadpogingen toestaan, en — cruciaal — nooit het enige geheim zijn. Combineer het met een wachtwoordafgeleide AES-256-GCM-sleutel die in het URL-fragment staat (na het #) zodat hij nooit de serverlog bereikt, en je hebt de meest voorkomende linklekvectoren uitgeschakeld — van Slack-previews tot bedrijfsproxy-archieven.

Entropie: de wiskunde van raadbaarbaarheid

Een slug van 6 tekens bestaande uit letters en cijfers heeft 36^6 = 2,1 miljard combinaties. Dat klinkt enorm totdat je beseft dat een botnet 100.000 URL's per seconde kan testen tegen een CDN — wat betekent dat een niet-geverifieerde aanvaller de volledige ruimte in ongeveer zes uur doorkruist. Verhoog naar 128 bits (22 tekens base64url) en de gokduur overstijgt de warmtedood van het universum. Gebruik crypto.getRandomValues(), nooit Math.random(), en codeer nooit een database-ID. Opeenvolgende tokens lekken het overdrachtsvolume aan iedereen die twee samples een week van elkaar verzamelt.

Zet de sleutel in het fragment, niet in het pad

Alles na # in een URL is de fragmentidentificator — browsers sturen het nooit naar de server. De decryptiesleutel hierin opslaan is het patroon dat Firefox Send heeft gepioneerd: /#k=abc123xyz. De server ziet alleen de ondoorzichtige downloadslug, dus toegangslogboeken, SIEM-exports en datalekdumps bevatten geen sleutelmateriaal. CDN-edge-caches kunnen de payload ook niet ontsleutelen. Slack-unfurls verwijderen het fragment wanneer ze de URL onderzoeken, zodat de preview-bot de sleutel nooit ziet. Deze ene truc blokkeert 80% van praktische linkonderschepingsaanvallen.

Vervaltijden die overeenkomen met de dreiging

Een standaard vervalperiode van 7 dagen is voor de meeste gebruikssituaties te ruim. Kalibreer op werkstroom: 15 minuten voor een .pdf-betalingsopdracht aan een bank, 4 uur voor een contractreview, 24 uur voor een fotoalbum, 7 dagen alleen voor asynchrone internationale samenwerking. Druk verval uit als absolute UTC-tijdstempel in de ondertekende URL-payload en handhaaf het server-side — vertrouw nooit op een clientklok. Bij verval: overschrijf de ciphertext op schijf met nullen (idealiter via blkdiscard op NVMe) zodat later forensisch onderzoek niets vindt.

Downloadtellers die werkelijk tellen

Een eenmalige downloadlink klinkt waterdicht totdat je beseft dat browsers actief gedeeltelijke overdrachten opnieuw proberen. Als Chrome bij 80% afbreekt en hervat met een nieuw Range-verzoek, telt dat dan als twee downloads? Implementeer de teller op de grens van bestandsvoltooiing, niet per HTTP-verzoek. Verhoog alleen wanneer de laatste byte is verzonden en de authenticatietag is geverifieerd. Alternatief: traceer unieke sessie-ID's over een venster van 10 minuten — één sessie = één download, ongeacht hoeveel Range-verzoeken er worden uitgestuurd. WeTransfer verwarrt deze concepten en is bekritiseerd voor het ten onrechte markeren van links als verbruikt.

Ondertekende URL's met kortlevende tokens

Voor zakelijke stromen: wikkel de download-URL in een HMAC-SHA256-handtekening over (slug, verval, max_downloads, issuer_id). De server valideert de handtekening voordat een byte wordt aangeboden. S3 pre-signed URL's doen dit van nature; R2 en Backblaze B2 volgen hetzelfde patroon. Een ondertekende URL die naar Slack lekt is nog steeds gevaarlijk, maar de korte verlooptijd (5 minuten) beperkt de schade. Combineer dit met IP-binding — de handtekening omvat het verwachte /24-prefix — om linkdoorzending tussen geografieën te verijdelen.

Verwijzer- en previewlekken voorkomen

Browsers sturen de volledige URL (min fragment) in de Referer-header tenzij je Referrer-Policy: no-referrer instelt op de downloadpagina. Zonder die header lekt een klik op een externe link vanaf de downloadpagina de slug naar elke tracker op de bestemming. Stel ook X-Robots-Tag: noindex, nofollow in en een robots.txt die /d/ blokkeert, zodat Googlebot geen link archiveert die per ongeluk op een forum is geplakt. Voor Slack- en Teams-previews: stuur 204 No Content terug aan User-Agents die overeenkomen met hun unfurl-bots.

Doorzendcontroles en ontvangerbinding

Zodra Alice Bob een link stuurt, kan Bob hem naar iedereen doorsturen. Bind de link aan Bob's identiteit om dit te voorkomen. Opties in toenemende sterkte: e-mailverificatie (eenmalige token naar bob@bedrijf.nl), sms-verificatie (OTP naar zijn telefoonnummer), passkey-registratie bij het eerste bezoek, of OIDC-aanmelding via Bob's Google Workspace. Elke stap ruilt wrijving voor insluiting. Voor een AVG Artikel 15-inzageverzoek is e-mailverificatie gewoonlijk voldoende. Voor een HIPAA-gereguleerd laboratoriumresultaat hoort een passkey of OIDC.

Intrekking op verzoek

Zelfs met alle voorzorgsmaatregelen gaat er iets mis — een gestolen laptop, een beëindigd contract, een verkeerde ontvanger. Een intrekknop die de link direct ongeldig maakt, is essentieel. Implementatie: bewaar een intrekkingslijst geïndexeerd op slughash, gecontroleerd bij elke download. Propageer naar CDN-edges binnen 60 seconden via purge-API (Cloudflare's /zones/:id/purge_cache accepteert een URL-lijst). HexaTransfer biedt intrekking via het afzendersdashboard; Dropbox Transfer en Smash ondersteunen het ook maar rekenen extra. Test intrekking elk kwartaal — een kapotte knop tijdens een incident is erger dan helemaal geen knop.

Telemetrie zonder surveillance

Log genoeg om misbruik te detecteren (IP-hash, User-Agent-familie, tijdstempel, verzonden bytes) maar niet genoeg om ontvangersidentiteit te reconstrueren. Hash IP-adressen met een dagelijks roterende sleutel zodat correlatievensters kort blijven. Log het URL-fragment uiteraard nooit. Een bewaarvenster van 30 dagen voldoet aan SOC 2 Common Criteria 7.2 zonder een surveillancearchief te creëren. Geef de afzender misbruiktellers in het dashboard zodat hij "3 mislukte wachtwoordpogingen van AS15169" ziet en weet dat hij de link moet intrekken.

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