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>
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指令——防盗链的主要内容,如果未能解决你的问题,请参考以下文章