你不能只是公开访问私密安全链接,对吧?
“私密”链接的安全模型
- 许多评论者认为,带有不可猜测令牌但没有访问控制的链接只是“安全性通过隐藏实现”。它们并非天生私密;只是很难被暴力破解。
- 也有人强调,隐藏性可以作为“带隐藏的安全性”中的一层,但绝不能是唯一的保护手段。
URL 中的秘密为何会泄露
- URL 会被记录在浏览器历史、服务器访问日志、反向代理、CDN、防火墙/IDS 日志以及链接扫描器中。密码字段和 POST 正文通常不会。
- 消息和电子邮件平台、安全网关以及 URL 扫描服务会自动抓取链接以生成预览或检查恶意软件,无意中暴露“魔法链接”,甚至下载的文件。
- 非 E2EE 渠道意味着平台能看到所有链接;用户往往没有意识到这一点。
链接与密码的比较
- 理论上,一个很长的随机 URL 令牌可以拥有比密码高得多的熵,实际上几乎无法被暴力破解。
- 但在实践中,工具和用户都会把密码视为敏感信息;而 URL 却经常被存储、分享和索引。
- 链接是“你拥有的东西”,很容易被复制;密码是“你知道的东西”,至少原则上如此。
在 URL 中使用令牌的正当用途
- 短期有效、一次性使用的令牌,例如用于重置密码、邮箱验证、S3 预签名 URL 以及类似流程,已被广泛接受。
- 某些媒体访问模式(CDN 托管图片、没有 cookie 的 WebSockets、二进制缓存)常常出于必要或便利而依赖 URL 令牌。
缓解措施与更好的模式
- 推荐的缓解措施包括:极短过期时间、一次性使用、按用户分配令牌、可撤销、限流,以及避免长期有效的“无限使用”魔法链接。
- 优先在请求头/cookie 或 POST 正文中进行认证;避免在查询字符串或路径中放置持久秘密。
- 使用 URL 片段存放秘密可以让它们不经过网络传输,但这只适用于客户端逻辑,而且仍有 JS 外泄和浏览器历史泄露的风险。
- 有些人建议使用方案或头部把 URL 标记为“私密”,但也有人指出,攻击者和部分扫描器会直接忽略这些标记。
扫描工具、用户体验与责任
- 关于谁负责存在争论:公开索引被扫描 URL 的服务、自动提交链接的电子邮件/消息平台,还是把认证编码进 URL 的开发者。
- 多位评论者指出糟糕的 UX:扫描工具默认公开结果,却没有清楚警告用户,或使用诸如“public scan”和“report”这类含糊标签。