Referrer Policy
在页面引入图片、JS 等资源或者当一个用户点击当前页面中的一个链接,然后跳转到目标页面时,目标页面会收到一个信息,即用户是从哪个源链接跳转过来的。也就是说,当你发起一个 http 请求,请求头中的 referrer 字段就说明了你是从哪个页面发起该请求的。
特别使用 网站统计 和做 广告联盟 的因为没有页面地址无法准确判断页面给出正确结果甚至可能被判违规。
Referrer 在分析用户来源时很有用,有着广泛的使用。但 URL 可能包含用户敏感信息,如果被第三方网站拿到很不安全(例如之前不少 Wap 站把用户 SESSION ID 放在 URL 中传递,第三方拿到 URL 就可以看到别人登录后的页面)。之前浏览器会按自己的默认规则来决定是否加上 Referrer。
General
可以看见 Referrer 的策略是 strict-origin-when-cross-origin
Request URL: https://github.com/yakeing
Request Method: GET
Status Code: 200
Remote Address: 97.64.23.206:443
Referrer Policy: strict-origin-when-cross-origin
Request Headers
因为策略问题使得 Referrer 来源地址并非当前页面地址。
accept: */*
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
referer: https://yake.tk
user-agent: Mozilla/5.0 (Windows) Chrome/99.111 Safari/567.36
五种常用 Referrer 策略
策略 | 属性值 | 作用 |
---|---|---|
No Referrer | no-referrer (never) | 不发送 |
No Referrer When Downgrade | no-referrer-when-downgrade (default) | 降级时不发送(HTTPS降HTTP) |
Origin Only | origin | 仅发送域名和端口 |
Origin When Cross-origin | origin-when-crossorigin | 跨域仅发送域名和端口 |
Unsafe URL | unsafe-url (always) | 发送 |
现阶段的浏览器还保留了对 never、default 和 always 的支持,但是已经不推荐使用了。
候选标准 Referrer 策略
1.no-referrer
从字面意思就可以理解,不传递 Referrer 报头的值。
2.no-referrer-when-downgrade
当发生降级(比如从 https:// 跳转到 http:// )时,不传递 Referrer 报头。但是反过来的话不受影响。通常也会当作浏览器的默认安全策略。
3.same-origin
同源,即当协议、域名和端口(如果有一方指定的话)都相同,才会传递 Referrer。
4.origin
将当前页面过滤掉参数及路径部分,仅将协议、域名和端口(如果有的话)当作 Referrer。
5.strict-origin
类似于 origin,但是不能降级。
6.origin-when-cross-origin
跨域时(协议、域名和端口只有一个不同)和 origin 模式相同,否则 Referrer 还是传递当前页的全路径。
7.strict-origin-when-cross-origin
与 origin-when-cross-origin 类似,但不能降级。
8.unsafe-url
任意情况下,都发送当前页的全部地址到 Referrer,最宽松和不安全的策略。
空字符串
若设为空串则默认按照浏览器的机制设置 referrer 的内容,默认情况下是和 no-referrer-when-downgrade
设置得一样。
什么是跨域
跨域是指跨域名的访问,以下情况都属于跨域
- 域名不同
- 域名相同,端口不同
- 二级域名不同
改变策略方法
通过 Referrer-Policy
HTTP header 设置:
Referrer-Policy: no-referrer-when-downgrade
通过指定 name
值为 referrer 的 meta
标签,可以达到效果:
<meta name="referrer" content="no-referrer-when-downgrade">
配置好之后再次打开页面刷新测试一下.
accept: */*
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
referer: https://yake.tk/post/***.html
user-agent: Mozilla/5.0 (Windows) Chrome/99.111 Safari/567.36
可以看见 Referrer 来源地址与页面地址一致。
标签属性
a
和 link
标签可以通过属性 rel
指定 noreferrer,仅对当前链接有效;
a
、area
、link
、iframe
和 img
还可以通过 referrerpolicy 指定仅针对当前链接的设置。
总结
可以看到,通过改变 Referrer 策略,网站所有者可以选择更高的安全级别来保证用户隐私不被泄露;也可以选择更低的安全级别来获得一些便利,相比之前只能由浏览器默认策略一刀切,确实灵活了不少。