Referrer 策略

常用的 Referrer Policy 规定 Referrer 策略

Referrer Policy

在页面引入图片、JS 等资源或者当一个用户点击当前页面中的一个链接,然后跳转到目标页面时,目标页面会收到一个信息,即用户是从哪个源链接跳转过来的。也就是说,当你发起一个 http 请求,请求头中的 referrer 字段就说明了你是从哪个页面发起该请求的。

特别使用 网站统计 和做 广告联盟 的因为没有页面地址无法准确判断页面给出正确结果甚至可能被判违规。

Referrer 在分析用户来源时很有用,有着广泛的使用。但 URL 可能包含用户敏感信息,如果被第三方网站拿到很不安全(例如之前不少 Wap 站把用户 SESSION ID 放在 URL 中传递,第三方拿到 URL 就可以看到别人登录后的页面)。之前浏览器会按自己的默认规则来决定是否加上 Referrer。 

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 Referrerno-referrer (never)不发送
No Referrer When Downgradeno-referrer-when-downgrade (default)降级时不发送(HTTPS降HTTP)
Origin Onlyorigin仅发送域名和端口
Origin When Cross-originorigin-when-crossorigin跨域仅发送域名和端口
Unsafe URLunsafe-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 值为 referrermeta 标签,可以达到效果:

<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 来源地址与页面地址一致。

标签属性

alink 标签可以通过属性 rel 指定 noreferrer,仅对当前链接有效; aarealinkiframeimg 还可以通过 referrerpolicy 指定仅针对当前链接的设置。

总结

可以看到,通过改变 Referrer 策略,网站所有者可以选择更高的安全级别来保证用户隐私不被泄露;也可以选择更低的安全级别来获得一些便利,相比之前只能由浏览器默认策略一刀切,确实灵活了不少。

如果文章图片不显示请点击CDN图片缓存更新
分享到:
.