本文分享自微信公众号 - code秘密花园(code_mmhy),作者:ConardLi
原文出处及转载信息见文内详细说明,如有侵权,请联系 1278556902@qq.com 删除。
原始发表时间:2020-11-17
前言
如果你的站点有使用 Referer 标头收集网页的访问来源信息,则此策略变化可能对你的程序造成影响,请仔细阅读。
在开始阅读本文之前,如果你不理解 site
和 origin
之间的关系,请阅读:同站和同源你理解清楚了么?
Referer 标头
Referer
请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。
服务端一般使用 Referer
请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
这里有意思的一点:referer 实际上是 “referrer” 误拼写。Referrer-Policy 标头以及 JavaScript 中的 referrer 拼写是没有问题的。
Referer-Policy
Referer
请求头可能暴露用户的浏览历史,涉及到用户的隐私问题。所以 HTTP 提供了 Referrer-Policy
标头,其用来监管和限制哪些访问来源信息会在 Referer
中发送(应该被包含在生成的请求当中)。
Referer-Policy
包括以下几个可选项
- no-referrer
整个 Referer
首部会被移除。访问来源信息不随着请求一起发送。
- no-referrer-when-downgrade (默认值)
在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS)
,但是在降级的情况下不会被发送 (HTTPS->HTTP)
。
- origin
在任何情况下,仅发送文件的源作为引用地址。例如https://example.com/page.html
会将 https://example.com/
作为引用地址。
- origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。
- same-origin
对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。
- strict-origin
在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS)
,但是在降级的情况下不会发送 (HTTPS->HTTP)
。
- strict-origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS)
;在降级的情况下不发送此首部 (HTTPS->HTTP)
。
- unsafe-url
无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。
Referer-Policy 默认值
如果 Referer-Policy
未设置任何策略,则使用浏览器的默认值。网站通常会遵循浏览器的默认设置。
对于导航和 iframe, Referer
头中的数据也可以通过 JavaScript 使用 document.referrer
访问。
no-referrer-when-downgrade
是跨浏览器的一种广泛的默认策略。但是现在,许多浏览器正处于向更多提高隐私的默认设置过渡的阶段。
Chrome 计划在85版开始 将其切换默认策略 no-referrer-when-downgrade
更换到strict-origin-when-cross-origin
。
变化
strict-origin-when-cross-origin
提供更多的隐私。有了这个政策,Referer 标头只会发送 origin
这样可以防止泄漏私人数据,这些数据可以从完整URL的其他部分(例如路径和查询字符串)访问。
例如,在一个跨域请求中:
从https://site-one.example/stuff/detail?tag=red
访问https://site-two.example/…
使用 no-referrer-when-downgrade
: Referer: https://site-one.example/stuff/detail?tag=red
。
使用 strict-origin-when-cross-origin
: Referer: https://site-one.example/
。
不变的
和 no-referrer-when-downgrade
一样,strict-origin-when-cross-origin
在从 HTTPS 来源访问 HTTP 站点时,不会携带Referer
头。
在相同的来源内,Referer
标头值为完整的 URL 。