注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

nginx中设置黑名单的方法  

2015-10-20 10:48:11|  分类: nginx编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在Nginx中将特定用户代理列入黑名单
            在浏览器中,HTTP_USER_AGENT(http_user_agent)是用来检查浏览页面的访问者在用什么操作系统,当然会返回给后端服务器系统,nginx就是使用$http_user_agent来收集浏览器客户端发回的"包含有用户代理字符串的变量",对该串中内容进行匹配,就可以发现不良内容的请求,从而对此请求进行处理(比如阻断/延时/重定向等).
            因为nginx.conf的配置文件支持include,所以我们可将黑名单文件(实际为文本的)存储在特定的地方,再由nginx.conf去抓取就可以了。

1、实现黑名单的nginx机理
       黑名单可以理解为:要配置用户代理阻挡列表,只需在nginx配置文件中转来配置就可以。具体则是在nginx.conf中,找到server定义部分(如/etc/nginx/nginx.conf),增加形如如下的配置参数。
代码如下:
    server {
        listen       80 default_server;
        server_name  xmodulo.com;
        root         /usr/share/nginx/html;
        ....
    }
 在打开该配置文件并找到 server 部分后,添加以下 if 声明到该部分内的某个地方。
参考代码如下:
    server {
        listen       80 default_server;
        server_name  xmodulo.com;
        root         /usr/share/nginx/html;
        # 大小写敏感的匹配
        if ($http_user_agent ~ (Antivirx|Arian)) {
                                                  return 403;
                                                }
          #大小写无关的匹配
参考代码如下:
          if ($http_user_agent ~* (netcrawl|npbot|malicious)) {
                return 403;
          }
             ....
         }
 
         这样 if 声明使用正则表达式匹配了任意不良用户字符串,并向匹配的对象返回403 HTTP状态码。
         $http_user_agent是HTTP请求中的一个包含有用户代理字符串的变量,它是浏览器发送的 HTTP 请求的一部分(不是正文信息内容)。‘~'操作符针对用户代理字符串进行大小写敏感匹配,而‘~*'操作符则进行大小写无关匹配。‘|'操作符是逻辑或,因此,你可以在 if 声明中放入众多的用户代理关键字,然后将它们全部阻挡掉。


2、 管理Nginx中的用户代理黑名单
        以上例子可以在nginx中如何阻挡一些用户代理的HTTP请求。
       但是由于用户代理黑名单会增长得很大,那将它们放在nginx的server部分不是个好办法。我们可以创建一个独立的文件,在该文件中列出所有被阻挡的用户代理的条目。如下是参考案例,如/etc/nginx/useragent.rules,并定义以下面的格式定义所有被阻挡的用户代理的条目。
    
      $ sudo vi /etc/nginx/useragent.rules

参考代码如下:
     map $http_user_agent $badagent {
                                                 default         0;
                                                 ~*malicious     1;
                                                 ~*backdoor      1;
                                                 ~*netcrawler    1;
                                                 ~Antivirx       1;
                                                 ~Arian          1;
                                                 ~webbandit      1;
                                                     }
         与先前的配置类似,‘~*'将匹配以大小写不敏感的方式匹配关键字,而‘~'将使用大小写敏感的正则表达式匹配关键字。“default 0”行所表达的意思是,任何其它文件中未被列出的用户代理将被允许。
          再将上面文件插入nginx配置文件(nginx.conf),找到里面包含 http 的部分,然后添加以下行到 http 部分某个位置。
   
    参考代码如下:
           http {
                  .....
                  include /etc/nginx/useragent.rules
                 }
      在nginx配置语法中,该 include 声明必须出现在 server 部分之前(这就是为什么我们将它添加到了 http 部分里)。现在,打开nginx配置定义的server部分,添加以下 if 声明:
      参考代码如下:
       server {
                ....
                         if ($badagent) {
                                  return 403;
                          }
              ....
               }



附:nginx中的$http_referer代表的是这个请求是从那一个页面链接转过来的。这个HTTP_Referer是http请求的header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。此参数可以用于防盗链接。
  评论这张
 
阅读(108)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017