发表于 2018-11-13 11:43:45

nginx的valid_referers指令——防盗链

  一、利用valid_referers指令防盗链:
  HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,
  例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链
  情况。
  该指令"valid_referers"的语法:
  valid_referers ...
  默认值: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.htmlhttp://haha.baidu.com/FF/F4/haha.html;
  
      }
  log如下所示:
  IP - - "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 - - "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 - - "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- - "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 - - "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 - - "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,之后发现是正常的内容。


页: [1]
查看完整版本: nginx的valid_referers指令——防盗链