referrer防盗链

本文涉及的产品
.cn 域名,1个 12个月
简介: referrer防盗链

定义

“referrer防盗链”是互联网技术中一种防止资源被盗用的防护机制,主要用于保护服务器上的文件或内容不被未经授权的网站引用。

在HTTP协议中,referer(也写作referrer)是请求头的一部分,它会告诉服务器发起这次请求的网页URL。防盗链通过检查这个referer字段来判断请求是否合法:只有当请求的referer来源是我们允许的域名或者IP地址时,服务器才返回请求的资源,否则拒绝提供服务。

具体应用如:一个网站A存放了大量图片资源,为了防止其他未授权网站B直接盗链这些图片,网站A可以设置referrer防盗链策略,只允许从网站A自身域名发起的请求才能获取到图片资源,从而达到保护资源的目的。

使用referer

Referer是HTTP请求头的一个字段,包含了当前请求页面的来源页面的地址,通过该字段,我们可以检测访客是从哪里来的。

那么,referer到底有啥作用呢?

交互优化

在某些web应用的交互中,右上角会提供一个返回按钮,方便用户返回上一页

  image.png

其实现一般也比较简单

<a href="javascript: history.back();"></a>

这种处理方式隐藏的一个问题是:如果用户从其他入口如分享链接等地方直接进来时,点击这个按钮是无法返回。

因此在点击按钮时,我们可以判断document.referrer是否存在来优化交互:如果存在,则返回上一页;如果不存在,则直接返回首页。

应该注意到上面写的是referer,而在DOM中,使用的是referrer,这是因此请求头中的referer是由于历史原因导致的拼写错误,而在DOM规范中进行了修正,因此导致当前拼法并不统一的问题~

防盗链

当用户访问网页时,referer就是前一个网页的URL;如果是图片的话,通常指的就是图片所在的网页。当浏览器向服务器发送请求时,referer就自动携带在HTTP请求头了。

一个HTML页面往往包含多种资源,这些资源通过标签如script、img、link等形式嵌套在HTML文档中,一个完整页面往往需要经过发送多条HTTP请求下载资源,然后才能正常展示。由于HTML本身并没有对嵌套资源的来源做限制,基于这样的机制,盗链就成为了一种手段。

下面是关于盗链的 百度百科定义

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

打个比方:A网站将自己的静态资源如图片或视频等存放在服务器上。B网站在未经A允许的情况下,使用A网站的图片或视频资源,放置到自己的网站中。由于服务器资源是需要花钱的,这样网站B盗取了网站A的空间和流量,而A没有获取任何利益却承担了资源使用费。B盗用A资源放到自己网站的行为即为盗链。

防盗链一般由下面几种方式

定期修改文件名称或路径

通过referer,限制资源引用页的来源

通过cookie、session等进行身份认证

图片加水印等

这里我们主要关注一下referer的防盗链的原理。下面是nginx的防盗链配置

location ~* \.(gif|jpg|png)$ {
    valid_referers none blocked *.phptest.com;
    if ($invalid_referer) {
        return 403;
    }
}

这种方法是在server或者location段中加入:valid_referers。这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1。

该指令支持none和blocked,

其中none表示空的来路,也就是直接访问,比如直接在浏览器打开一个文件,

blocked表示被防火墙标记过的来路,*..com表示所有子域名。

通过referer,我们可以判断请求的来源,从而决定服务器是否正常返回请求资源,达到控制请求的目的。

需要注意的是,在某些情况下,即使用户是正常访问网页或图片,也是不会携带referer的,比如直接在浏览器地址栏直接输入资源URL,或通过浏览器新窗口打开页面等。这种访问是正常的,如果强制现在某些白名单referer名单才能访问资源,则可能误伤这一部分正常用户,这也是为什么有的防盗链检测中允许Referer头部为空通过检测的情况。

既然如此,如果把referer隐藏掉,也可以绕开部分站点防盗链的限制,下面让我们来看看如何实现隐藏referer的功能。

隐藏referer

参考

html禁用referer

以Referer方案写一个图片防盗链服务并实现网页端"破解"

在利用部分站点防盗链限制允许referer为空,或者我们仅仅是不想让服务器知道访问来源时,我们可以隐藏referer。

referrerPolicy

之前浏览器在请求资源时,会按自己的默认规则来决定是否加上Referrer。后来W3C发布了Referrer-Policy草案,运行开发者灵活地控制自己网站的referer策略。主要包含下面策略

no-referrer:任何情况下都不发送 Referrer 信息;

no-referrer-when-downgrade (默认值):在没有指定任何策略的情况下浏览器的默认行为

origin:在任何情况下,仅发送文件的源作为引用地址

origin-when-cross-origin: 对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。

same-origin:对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。

上面只列举了一部分可选策略,详情可参考 MDN文档。

因此,我们可以手动指定no-referrer来隐藏referer

<!-- phptest2.com是我本地的一个测试域名, 下同 -->
<img src="http://phptest2.com/upload/1.png" width="200" referrerPolicy="no-referrer" alt="">

或者在创建image对象的时候,指定referrerPolicy策略

const img = new Image()
img.referrerPolicy = 'no-referrer'

此时打开开发者工具就可以看见该图片的请求已经不再携带对应的referer了。总结一下,一般有下面几种设置Referer策略的方式:

通过 http 响应头中的 Referrer-Policy 字段

通过 meta 标签,name 为 referrer

通过a、area、img、iframe、link元素的 referrerpolicy 属性。

通过a、area、link元素的 rel=noreferrer 属性。

需要注意的是目前referrerPolicy仍处于提案的草稿阶段,浏览器兼容性并不是特别好。


目录
相关文章
|
7月前
|
存储 小程序 API
oss防盗链设置(Referer Configuration)
oss防盗链设置(Referer Configuration)
1326 5
|
Docker 容器
80 # 图片防盗链
80 # 图片防盗链
52 0
|
CDN
CDN设置防盗链及使用鉴权功能——设置防盗链
CDN设置防盗链及使用鉴权功能——设置防盗链自制脑图
222 0
CDN设置防盗链及使用鉴权功能——设置防盗链
|
CDN
CDN防盗链设置
CDN防盗链设置自制脑图
152 0
CDN防盗链设置
|
弹性计算 负载均衡 网络协议
源站保护
源站保护
193 0
源站保护
|
前端开发
前端解决第三方图片防盗链的办法 - html referrer 访问图片资源403问题
前端解决第三方图片防盗链的办法 - html referrer 访问图片资源403问题
642 0
|
Java JavaScript 前端开发
解决图片 防盗链
js版解决方案 var url = 'https://mmbiz.qpic.cn/mmbiz_jpg/TAoksPVlXMI7dQPxiaUbAHvyJ19iaG9b2Ueh53iaqTsn6F8O3m63zcBibgNpujM1HNeCKX99vOo...
1864 0
|
Web App开发 应用服务中间件 Linux
|
应用服务中间件 nginx 网络安全