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,之后发现是正常的内容。
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,之后发现是正常的内容。
相关文章推荐
- Nginx+CI框架出现404错误怎么解决
- ubuntu+nginx+php7+mysql 安装
- Nginx配置Restful风格url
- nginx上搭建HLS流媒体服务器
- LNMP第二部分nginx、php配置
- nginx配置文件nginx.conf解读
- 发现一个nginx LUA开发Web App的框架
- Scaling CloudFlare’s Massive WAF
- centos6 yum 安装nginx 不成功解决办法
- nginx 同一端口根据不同域名转发到不同端口
- Nginx+CI出现404错误
- Nginx+CI出现404错误
- Nginx配置文件各配置项详细说明
- ubuntu下的nginx+php配置与常见问题
- CORS其实很简单:NGINX 一招搞定针对特定域名和端口跨域,动态决定跨域到哪里
- nginx location匹配
- nginx-1.5.10 之mips编译到RT5350
- nginx的配置系统
- 快速部署Python应用:Nginx+uWSGI配置详解
- (总结)Nginx配置文件nginx.conf中文详解