nginx的valid_referers指令——防盗链

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx的valid_referers指令——防盗链相关的知识,希望对你有一定的参考价值。

一、利用valid_referers指令防盗链:

HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,

例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链

情况。

该指令"valid_referers"的语法:
valid_referers [none|blocked|server_names] ...
默认值:none
使用环境:server,location
该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer。如果Referer Header头不符合valid_referers指令设置的有效Referer,变量$invalid_referer

将被设置为1.
该指令的参数可以为下面的内容:
none:表示无Referer值的情况。
blocked:表示Referer值被防火墙进行伪装。
server_names:表示一个或多个主机名称。从nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。

 

二、配置处理:

所用到的机器:
192.168.100.100 nginx
自己的pc机  xp


测试一、我打算用个rewrite来匹配相应的url。

nginx的配置如下:

 server {          listen 80;          server_name haha.baidu.com;          root /data/www/haha;
        location /FF/ {        valid_referers www.baidu.com;        if ($invalid_referer) {          return 403;        }        }
     }
    server {          listen 80;          server_name hehe.baidu.com;          root /data1/web/hehe/FF/F4;          rewrite /hehe.html  http://haha.baidu.com/FF/F4/haha.html;
        }

log如下所示:

IP - - [07/Mar/2012:09:32:00 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"hehe.baidu.com" "-"
IP - - [07/Mar/2012:09:32:00 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"haha.baidu.com" "-"

测试:在浏览器中输入http://hehe.baidu.com/hehe.html,浏览器其实403错误。

 


把 valid_referers www.baidu.com;中的www换成hehe,发现返回的也是403
log如下所示:


IP - - [07/Mar/2012:09:33:22 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"

"-" "hehe.baidu.com" "-"
IP- - [07/Mar/2012:09:33:22 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101

Firefox/10.0.2" "-" "haha.baidu.com" "-"

发现"$http_referer"的值为"-"也就是空。

 


总结:上面的问题是发现"$http_referer"的值为"-"也就是空,没有满足匹配的条件。如果我们加上none参数的话就可以了,我们让none也就是$http_referer"的值为"-"为有效值(已经测试)

 

 

测试二:
为了让"$http_referer"能拿到以server_name为hehe.baidu.com,我编辑了一下hehe.html,具体的内容如下所示:
html>

http://100.10.15.180:80;

        location /FF/ {
        valid_referers none blocked www.baidu.com;
        if ($invalid_referer) {
          return 403;
        }
        }

 


     }

    server {
          listen 80;
          server_name hehe.baidu.com;
          root /data/www/hehe/FF/F4;


        }


对应的log:如下所示:
IP - - [06/Mar/2012:17:24:37 +0800] "GET /hehe.html HTTP/1.1" 200 99 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"hehe.baidu.com" "-"
IP - - [06/Mar/2012:17:24:39 +0800] "GET /FF/F4/haha.html HTTP/1.1" 200 5 "http://hehe.baidu.com/hehe.html" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2)

Gecko/20100101 Firefox/10.0.2" "-" "haha.baidu.com" "-"

测试:http://hehe.baidu.com/hehe.html,接着再点击hehe,之后发现是403.

把www换成hehe。

接着测试:输入http://hehe.baidu.com/hehe.html,接着再点击hehe,之后发现是正常的内容。


以上是关于nginx的valid_referers指令——防盗链的主要内容,如果未能解决你的问题,请参考以下文章

nginx 实现valid_referer全面解析

Nginx防盗链模块ngx_http_referer_module

高并发之流量优化

nginx配置防盗链

8. Nginx资源的防盗链

付费语音视频文件鉴权操作之防下载