Nginx防盗链

referer 模块

该模块可以进行防盗链设置。

 

概述

对于图片来说,A网站,如果想使用B网站的图片,可以直接写上B网站图片的链接地址,或者将B网站的图片通过右键另存为的方式下载到本地,然后在页面上使用。如果B网站不想A网站这么干了,那么B网站可以采取防盗链的措施来干这个工作,结果就是,A网站想请求所需要的资源,通过url的方式,获取的可能不是原来的图片了,出现404或者别的图片替代了。如果通过浏览器直接打开图片url,那么仍然有可能显示404,这就是防盗链。

 

语法

该指令"valid_referers"的语法:

valid_referers    [none|blocked|server_names] ...

默认值:none

使用环境:server,location

该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer。如果Referer Header头不符合valid_referers指令设置的有效,变量$invalid_referer将被设置为1.

 

该指令的参数可以为下面的内容

valid_referers 表示合法的referers设置

none: 表示无Referer值的情况,直接通过浏览器或者其他工具访问。

blocked: 表示有referers,但是值被代理服务器或者防火墙隐藏;

server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。lutixia.net: 表示通过lutixia.net访问的referers,*.jfedu.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机。

 

再说的通俗一点

valid_referers 定资源访问是通过以下几种方式为合法,即白名单

none: 允许缺失的头部访问

blocked: 允许referer没有对应值的请求

server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。lutixia.net: 表示通过lutixia.net访问的referers,*.jfedu.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机。

 

HTTP Referer

HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。

Referer到底是什么东西?我的nginx配置文件很简单,打开autoindex功能,即将整个目录列出来。然后将默认的index.html文件修改为index.html.bak,同时在目录下面创建一个jfedu.html文件

   location / {

           autoindex on;

            root   html;

            index  index.html index.htm;

        }

来到主页,可以看到将文件目录全部列出来,我们要通过jfedu.html这个文件来做测试

下面图片的方式是通过在网页内通过鼠标点击jfedu.htm来访问该资源,可以看到是有Reference的值的,当前的reference信息就是当前网页的信息。可以看出从当前网页内访问的资源的Reference是有值的,即当前网页的信息。

下面这张图片是通过在网址栏输入资源地址直接访问的,不是通过鼠标在网站内点击访问,可以看到Reference的值是不存在的。直接输入链接标准的IP+资源是不存在Reference的值的。(匹配到的none

 

防盗链案例一则

这是一个正则匹配,如果是以.gif,jpg,png,swf,flv结尾的文件,就匹配这个location规则,这些规则定义就是两个花括号里面的内容。

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked lutixia.net  *.jfedu.net;

root /usr/share/nginx/html;

if ($invalid_referer) {

return 403;

} }

location ~* \.(gif|jpg|png|swf|flv)${}为设置防盗链的文件类型,使用竖线|分隔。~*表示忽略大小写,只要是访问以.gif jpg png swf flv结尾的请求就匹配花括号里面的规则

 

valid_referers  lutixia.net  *.jfedu.net;为白名单,使用空格分隔,可以使用*进行泛域名设置。

 

if ($invalid_referer) {}为判断是否符合白名单,不符合白名单将执行{}内的内容。

总结就是:以上所有来自lutixia.net  *.jfedu.net的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面。

 

测试192.168.179.179.100去盗用192.168.179.99的图片

(1)在192.168.179.100上配置下面信息去盗用192.168.179.99的图片jfedu.png

[root@localhost nginx-1.16.1]# vim /usr/local/nginx/html/jfedu.html

[root@localhost nginx-1.16.1]# cat /usr/local/nginx/html/jfedu.html

this is 192.168.179.100

<image src="http://192.168.179.99/jfedu.png">

 

(2)192.168.179.99提供图片给100去盗取

[root@www nginx-1.16.1]# cp /usr/share/httpd/icons/icon.sheet.png  /usr/local/nginx/html/jfedu.png

可以看到没加上防盗链规则192.168.179.100可以去盗用192.168.179.99的图片

[root@www nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf  --加上防盗链规则,注意要把自己的IP加上

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked 192.168.179.99  lutixia.net  *.jfedu.net;

root /usr/local/nginx/html;

if ($invalid_referer) {

return 403;

} }

 

[root@www ~]# /usr/local/nginx/sbin/nginx -s reload  --重启服务

可以看到加上防盗链规则之后盗取失败了,返回403状态码

再来看看192.168.179.99的日志信息,可以看到请求的资源是jfedu.png,但是referrer并不是本机,这是一个盗链。

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