翁の微语

Referrer-Policy与Referrer防盗链

某翁 HTTPReferrer防盗链

前几天安装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防盗链是唯一方案?但好像配合服务端爬虫也可以破解。解决方案仍等待寻找…

某翁
一个普通学生而已x