Referer 标头:隐私和安全问题
与 Referer HTTP 标头 相关的隐私和安全风险。本文将介绍这些风险,并提供有关减轻这些风险的建议。
Referrer 问题
Referer
(原文如此)标头包含请求的地址(例如,先前网页的地址,该网页包含指向当前请求页面的链接,或加载图像或其他资源的页面的地址)。这有许多相当无害的用途,包括分析、记录或优化缓存。但是,还有一些更成问题的使用方式,例如跟踪或窃取信息,甚至仅仅是副作用,例如无意中泄露敏感信息。
例如,考虑一个带有页脚中的社交媒体链接的“重置密码”页面。如果链接被点击,根据信息的共享方式,社交媒体网站可能会收到重置密码 URL,并且仍然能够使用共享的信息,这可能会损害用户的安全。
同样,嵌入您页面中的第三方网站的图像可能会导致敏感信息泄露给第三方。即使安全没有受到损害,信息也可能不是用户想要共享的内容。
我们如何解决这个问题?
应用程序的合理设计可以减轻大部分这种风险。合理的应用程序将通过创建一次性密码重置 URL 或将它们与唯一的用户令牌相结合来消除此类风险。还可以通过更安全的方式传输敏感数据来降低风险。
您应该尽可能使用 POST
而不是 GET
,以避免通过 URL 将敏感数据传递到其他位置。
您应该始终为您的网站使用 HTTPS。这具有许多安全优势,包括 HTTPS 网站永远不会将 Referrer 信息传输到非 HTTPS 网站这一事实。随着大多数 Web 开始使用 HTTPS,此建议不再那么重要,但仍然值得考虑。
此外,您应该考虑从网站的安全区域(如密码重置页面、支付表单、登录区域等)中删除所有第三方内容(例如,嵌入在 <iframe>
中的社交网络小部件)。
您还可以使用以下方法来减轻此类风险
- 服务器上的
Referrer-Policy
标头,以控制通过Referer
标头发送的信息。例如,no-referrer
指令将完全省略 Referer 标头。 - 有泄露此类信息的风险的 HTML 元素(例如
<img>
和<a>
)上的referrerpolicy
属性。例如,可以将其设置为no-referrer
,以完全停止发送Referer
标头。 - 有泄露此类信息的风险的 HTML 元素(例如
<form>
和<a>
)上设置为noreferrer
的rel
属性。 - 具有 名称 为
referrer
且内容设置为no-referrer
的<meta>
元素,用于禁用整个文档的 Referer 标头。请参阅 Referrer-Policy 与 HTML 的集成。 - 退出页面 技术。
注重安全的服务器端框架往往内置了针对此类问题的缓解措施,例如
- Django 中的安全(尤其要查看 跨站点请求伪造 (CSRF) 防护)。
- helmetjs referrer-policy — 用于在 Node.js/Express 应用程序中设置 Referrer-Policy 的中间件(另请参阅 helmetjs 以获取更多安全规定)。
政策和要求
为您的项目团队编写一套安全和隐私要求以指定此类功能的使用,以减轻相关的风险,这是合理的。您应该寻求 Web 安全专家的帮助来编写这些要求,并考虑用户的需求和福利,以及立法(如 欧盟通用数据保护条例 (GDPR))强制实施的政策和法规等其他问题。