跳转到内容
HexaTransfer
返回博客
加密与安全

安全链接共享最佳实践:保护您的下载URL

安全下载链接共享的最佳实践。URL令牌安全、链接过期和下载限制。

安全下载链接应将 URL 本身视为密钥的一部分。斜杠后的标识符至少需要 128 位熵(类似 hexatransfer.com/d/7Kj9xQmN2vP8rBwLsE4fT),过期时间应以小时而非天计算,将下载次数上限设为一两次,并且——最关键的——绝不能是唯一的秘密。将其与通过密码派生的 AES-256-GCM 密钥配对,密钥放在 URL 片段(# 之后)中,这样就不会出现在服务器日志里,从而抵御从 Slack 预览到企业代理日志等最常见的链接泄露途径。

熵值:可猜测性的数学原理

由字母和数字组成的 6 字符标识符有 36^6 = 21 亿种组合,听起来很多,但一个僵尸网络每秒可对 CDN 测试 100,000 个 URL——这意味着未经认证的攻击者在大约六小时内就能穷举整个搜索空间。将标识符升级到 128 位(22 个 base64url 字符),猜测时间将超过宇宙热寂。使用 crypto.getRandomValues(),绝不用 Math.random(),也绝不编码数据库 ID。顺序令牌会向任何相隔一周收集两个样本的人泄露传输量信息。

将密钥放在片段中,而非路径中

URL 中 # 之后的所有内容是片段标识符——浏览器不会将其发送到服务器。将解密密钥存储在此处是 Firefox Send 开创的模式:/#k=abc123xyz。服务器看到的只是不透明的下载标识符,因此其访问日志、SIEM 导出和泄露数据转储均不包含任何密钥材料。CDN 边缘节点同样无法解密内容。Slack 展开链接时会去掉片段,因此预览机器人永远看不到密钥。这一技巧单独就能阻断 80% 的实际链接拦截攻击。

与威胁相匹配的过期窗口

默认 7 天过期对大多数使用场景过于宽松。根据工作流程进行校准:发给银行的汇款 .pdf 设 15 分钟,合同审阅设 4 小时,相册设 24 小时,仅对跨时区异步协作才设 7 天。将过期时间表达为签名 URL 有效载荷中的绝对 UTC 时间戳,并在服务端强制执行——绝不信任客户端时钟。过期时,用零覆盖磁盘上的密文(理想情况下通过 NVMe 上的 blkdiscard),使后续的磁盘取证扫描什么也找不到。

真正有效的下载计数器

单次下载链接听起来无懈可击,但浏览器会积极重试部分传输。如果 Chrome 在 80% 时中断并用新的 Range 请求恢复,这算一次还是两次下载?应在文件完成边界处增加计数器,而非每次 HTTP 请求。仅在最后一个字节发送完毕且认证标签验证通过时才增加计数。或者,在 10 分钟窗口内跟踪唯一会话 ID:一个会话 = 一次下载,无论发出多少 Range 请求。WeTransfer 混淆了这两者,因此被批评误报链接已消耗。

带短期令牌的签名 URL

对于企业流程,使用 HMAC-SHA256 签名封装下载 URL,签名范围包含(标识符、过期时间、最大下载次数、发行方 ID)。服务器在提供任何字节之前验证签名。S3 预签名 URL 原生支持这一机制,R2 和 Backblaze B2 遵循相同模式。泄露到 Slack 的签名 URL 仍然危险,但短暂的过期时间(例如 5 分钟)限制了损害范围。将 IP 绑定加入签名——签名包含预期的 /24 前缀——可防止跨地区的链接转发。

防止 Referer 和预览泄露

除非在下载页面设置 Referrer-Policy: no-referrer,否则浏览器会在 Referer 头中发送完整 URL(不含片段)。没有这个头,从下载页面点击外部链接会将标识符泄露给目标网站上的每一个追踪器。同时设置 X-Robots-Tag: noindex, nofollow 以及阻止 /d/ 路径的 robots.txt,防止 Googlebot 将意外粘贴到论坛的链接归档。对于 Slack 和 Teams 的预览,对匹配其展开机器人 User-Agent 的请求返回 204 No Content。

转发控制与接收方绑定

Alice 将链接发给 Bob 后,Bob 可以将其转发给任何人。为防止这种情况,将链接绑定到 Bob 的身份。方案按强度递增:电子邮件验证(向 bob@firm.com 发送一次性令牌)、短信验证(向手机号发送 OTP)、首次访问时注册通行密钥,或通过 Bob 的 Google Workspace 进行 OIDC 登录。每一步都在摩擦与限制之间取舍。对于 GDPR 第 15 条的数据主体访问响应,电子邮件验证通常已足够;对于 HIPAA 受监管的实验室结果,则需要通行密钥或 OIDC。

在中国大陆场景下,接收方身份验证的数据(如手机号、邮箱地址)处理须符合《个人信息保护法》(PIPL)的知情同意和最小化原则。

按需撤销

即便有了所有防护措施,意外仍会发生——笔记本电脑被盗、承包商离职、发错接收方。能够立即终止链接的撤销按钮至关重要。实现方式:维护一个以标识符哈希为键的撤销列表,每次下载时检查。通过清除 API 在 60 秒内将撤销传播到 CDN 边缘节点(Cloudflare 的 /zones/:id/purge_cache 接受 URL 列表)。HexaTransfer 通过发送方控制台提供撤销功能。应每季度测试撤销功能——事件发生时失效的按钮比没有按钮更糟糕。

不成为监控系统的遥测

记录足以检测滥用的信息(IP 哈希、User-Agent 家族、时间戳、已传输字节数),但不足以重建接收方身份。使用每日轮换的密钥对 IP 进行哈希,使关联窗口保持在较短范围内。显然,永远不要记录 URL 片段。30 天的保留窗口可满足 SOC 2 通用标准 7.2 的要求,同时不会形成监控存档。将滥用计数器向发送方展示,让其看到"来自 AS15169 的 3 次密码失败尝试",从而知晓是否需要撤销。

在 hexatransfer.com 上试试 — 免费、无需注册、最多 10 GB。

通过端到端加密安全发送大文件

通过端到端加密免费传输最大10GB的文件。无需注册账户。文件在上传前在浏览器中加密,其他人无法读取。

发送文件