保护 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,我假设这将具有挑战性(或者你不想重写文档)。
我开发的软件将文件存储在随机名称的目录中,以防止未经授权的用户下载文件。
我们首先需要将它们存储在单独的顶级域中(以防止 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,我假设这将具有挑战性(或者你不想重写文档)。