您的位置:首页 > 运维架构 > Nginx

nginx的valid_referers指令防盗链

2016-03-04 09:56 615 查看
一、基本内容理解:利用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中可以使用通配符"*"号。

 

二、配置处理:

所用到的机器:

10.1.15.156 nginx

自己的pc机  xp

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

nginx的配置如下:

  server {

         
listen 80;

         
server_name haha.baidu.com;

         
root /data/www/haha;

#        
try_files $uri $uri/ @proxy;

#        
location @proxy {

#        
proxy_passhttp://10.1.15.125:80;

#

#        
}

#      
}

       
location /FF/ {

       
valid_referers www.baidu.com;

       
if ($invalid_referer) {

         
return 403;

       
}

       
}

 

    
}

    server
{

         
listen 80;

         
server_name hehe.baidu.com;

         
root /data/www/hehe/FF/F4;

         
rewrite /hehe.htmlhttp://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
b28a
/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://10.1.15.125: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;

#        
rewrite /hehe.htmlhttp://haha.baidu.com/FF/F4/haha.html;

       
}

对应的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,之后发现是正常的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: