Referrer-Policy与Referrer防盗链
前几天安装NextCloud的时候发现了一个响应头:Referrer-Policy,仔细研究一番后发现他可以让目前流行的referrer防盗链机制几乎失效。这里给个栗子。
Demo1
这是QQ空间的图片。抓包可以看到实际上地址相同,唯一的区别是referrerpolicy="no-referrer"
。
Demo2 (流量巨大注意)
这里盗链了一个网盘(个人网盘,看他啥时候倒闭)作为视频播放源。
查看源码可以发现,盗链成功的视频位于一个iframe中。iframe的src是dataurl,实际内容是:
<meta name=referrer content=never>
<video width=300px controls src=视频地址></video>
原理
Referrer Policy(引用策略)就是从一个文档发出请求时,是否在请求头部定义 Referrer 的设置。
这里就得提到一个HTTP协议中的拼写错误:浏览器发送的请求头是Referer
,实际上是Referrer
,HTTP协议中少了一个r
但是在其他处均已更正。
referrer-policy分为新旧两个标准。IE,Edge,iOS仅支持旧标准,其余大部分浏览器都支持新标准。旧标准通常被向下兼容。
标准
Referrer-Policy本意是保护隐私,并不是破解防盗链。新标准支持以下几个属性:
""
(空字符串,大部分浏览器处理为no-referrer-when-downgrade)no-referrer
永不发送no-referrer-when-downgrade
HTTPS->HTTP不发送same-origin
跨域不发送origin
(只发送origin,协议+域名+端口)strict-origin
(HTTPS->HTTP不发送,否则发送origin)origin-when-cross-origin
(跨域只发送origin)strict-origin-when-cross-origin
(HTTPS->HTTP不发送,跨域只发送origin)unsafe-url
(全部发送)
旧标准支持以下几个属性:
default
等同于""
never
等同于no-referrer
always
等同于unsafe-url
支持的设置方式:
- 服务端设置header
Referrer-Policy:no-referrer
- HTML Head 中放置Meta标签
<meta name=referrer content=no-referrer>
<a>
<img>
<iframe>
标签(目前已知)支持referrerpolicy="no-referrer"
属性<a>
标签还支持rel="noreferrer"
属性。
旧标准通常只在Meta标签中被支持。
进一步防盗链
可能基于URL的Token防盗链是唯一方案?但好像配合服务端爬虫也可以破解。解决方案仍等待寻找…