保护 HTTP 引用

Securing HTTP referer

我开发的软件将文件存储在随机名称的目录中,以防止未经授权的用户下载文件。

我们首先需要将它们存储在单独的顶级域中(以防止 cookie 被盗)。

第二个危险是 HTTP referer,它可能会泄露秘密目录的名称。

我对 Chrome 浏览器的实验表明,仅当我单击我的(秘密)文件中的 link 时才会发送 HTTP 引荐来源网址。所以问题仅限于可能包含 link 的文件(在 Chrome HTML 和 PDF 中)。对于所有浏览器,我可以依赖这种行为吗(不发送 referer 是不是从当前(秘密)页面 link 打开下一页,而是使用其他方法,例如直接输入 URL)?

所以问题仅限于 HTML 和 PDF 文件。但它不是一个完整的安全解决方案。

我怀疑我们可以通过在提供所有秘密文件时添加 Content-Disposition: attachment 来完全解决这个问题。它会阻止 HTTP referer 吗?

另请注意,我将为中间人使用 HTTPS,以免无法下载我们的秘密文件。

您可以使用 Referrer-Policy header to try to control referer behaviour. Please take note that this requires clients to implement this.

与其试图隐藏文件位置,不如建议您实施适当的身份验证和授权处理?

我同意 Referrer-Policy 是您最好的第一步,但正如 DaSourcerer 指出的那样,它并未在您可能支持的浏览器上普遍实施。

完全服务器端的解决方案如下:

  • 用户连接到 .../<secret>
  • 服务器生成一次性令牌并重定向到 .../<token>
  • 服务器提供文档并使令牌失效

现在 referer 将指向 .../<token>,这不再有效。然而,这具有可用性权衡:

  • 重新加载页面将不起作用(尽管您可以使用 cookie 或会话解决此问题)
  • 用户无法从 URL 栏分享 URL,因为它在技术上是无效的(在某些情况下这可能是次要的好处)

通过 IFRAME 而不是重定向,您可以在不牺牲可用性的情况下获得相同的基本好处。我不确定 IFRAME 如何影响 Referer。

这整个解决方案基本上只是主动完成 Referer 屏蔽。如果您可以重写文档中的链接,那么您可以在出路时使用 Referer 掩码。 (即重写所有链接,使它们指向 https://yoursite.com/redirect/....)既然你提到了 PDF,我假设这将具有挑战性(或者你不想重写文档)。