Nginx 防盗链

Nginx 防盗链

环境:CentOS7、Nginx 1.16.0

在Nginx提供的静态web资源服务中,其防盗链功能也是经常使用的。

什么是防盗链呢,看一下百度百科做出的解释:

哈哈哈, 开个玩笑?。

首先,我们需要知道什么是盗链,

盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。

简单解释,当我们写了一篇博客,里面展示了许多的图片,万万没想到,这篇博客火了,于是有许多的人摘抄复制,但是里面的图片都是存在我们自己图床上,于是乎,我们被其他网站消耗了大量的流量,而我们自己的原创作品却没有得到这应有的浏览和点击率,是不是十分可恨呢?

所以,我们需要一个防盗链的机制,使得其他网站无法盗用我们的资源。实现防盗链的方法有许多种,这里介绍一下如何在Nginx中实现简单的防盗链。


1.确定防盗链的设置思路

首要方式:区别哪些是正常的用户请求,而哪些是非正常的。

要辨别出不正常的用户请求并拒绝提供资源,不能误杀正常的用户请求。

2.基于http_refer防盗链配置模块

HTTP来源地址(referer,或 HTTP referer)是HTTP表头的一个字段,用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着HTTP来源地址,目前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

Referer的正确英语拼法是referrer。由于早期HTTP规范的拼写错误,为保持向下兼容就将错就错了。例如DOM Level 2[1]、Referrer Policy[2]等其他网络技术的规范曾试图修正此问题,使用正确拼法,导致目前拼法并不统一。

当我们打开百度首页并自动请求favicon.ico时,可以看到

这就是referer。


Nginx配置语法:

Syntax: valid_referers none|blocked|server_name|string ...;
Default: ——
Context: server, location

实际操作:

首先打开CentOS7,查看一下==/etc/nginx/nginx.conf==

由此可以得出,我们的日志文件中是会记录referer信息的。

这里我编写了一份index.html用于测试:

接下来当我访问一次该服务器,并查看日志

这里可以看到,这两条日志中的referer是不一样的,第一条是当我访问index.html时产生的,也就是说它的源头就是这台服务器本身,所以是"-"。

而加载到index.html中的img时,再次发出了一个请求,这次请求是从index.html中发出的,于是这条请求的referer就如上图所示变成了"http://127.0.0.1/index.html"了。

那么接下来配置防盗链,编辑==/etc/nginx/conf.d/==下的配置文件:

valid_referers 后所接的,就是我们所允许的请求

  • none表示无referer信息的请求
  • blocked表示不标准的,无协议信息的请求
  • 127.0.0.1则表示本地的请求
  • 也可以在其中写正则表达式来匹配

如果请求不属于其中,则返回403状态码。

那么我们发起的如referer信息为"-"的请求,仍然是可以成功的,而不属于上面三种的请求,比如:

这里通过curl发起一个伪造referer来自www.baidu.com的请求,可以发现,收到的是403的状态码,即这次请求是被拒绝的。

img-5Jw9V7MW-1565450991514)]

这里通过curl发起一个伪造referer来自www.baidu.com的请求,可以发现,收到的是403的状态码,即这次请求是被拒绝的。

这就是简单的Nginx防盗链,这种设置方法还是十分局限的,在后续将做出更多高级的有效的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章