zoukankan      html  css  js  c++  java
  • nginx禁止特定UA访问

    一、UA是什么?

     User Agent 简称UA,就是用户代理。通常我们用浏览器访问网站,在网站的日志中,我们的浏览器就是一种UA。

    二、禁止特定UA访问

    最近有个网站(www.C.com)抄袭公司主站(www.A.com)的内容,除了域名不同,内容、图片等都完全是我们主站的内容。

    出现这种情况,有两种可能:

    一种是:它用爬虫抓取公司主站(www.A.com)的内容并放到自己服务器上显示;

    另一种是:通过将访问代理至公司主站(www.A.com),而域名(www.C.com)是盗用者的,骗取流量。

    无论怎样,都要禁止这种行为的继续。

    通过分析日志,没有发现爬虫大量爬取公司主站(www.A.com)内容页面的信息。

    测试是否是代理,测试步骤:

    1)访问www.C.com并指定参数

    URL : www.C.com/chaojikaifangfu.html/?cccc

    2)检查公司主站的web服务器上的nginx日志

    发现有记录,说明刚才的访问被代理到公司主站web上了。

    UA(双引号里边的是UA的全名):Resty/HTTP 0.03 (Lua)

    有两种方法解决:

    1)禁止IP

    2)禁止UA

    从nginx日志观察,访问者的代理IP经常变,但是访问UA却是固定的,因而可以禁止UA。

    禁止特定UA:

    1)nginx配置信息

    nginx配置目录:/usr/local/nginx/conf/

    2)在nginx配置目录中,创建新的配置文件agent_deny.conf,添加如下内容:

    # 禁止特定UA访问
    # ~ "Lua" :表示用户UA匹配"Lua"字符串,区分大小写
    # 当用户UA被匹配成功,则返回403错误,不给予访问。
    if ($http_user_agent ~ "Lua"){ return 403; }

    3)添加该配置到相应的server或location段

    include  agent_deny.conf;

    注意:不能加到http段,if 用于http段会报语法错误的。

    4)使配置生效

    nginx -t
    nginx -s reload

    5)检查禁止特定UA的功能是否成功

     利用curl工具,指定UA去访问公司主站(www.A.com)

     没禁止特定UA前,访问结果:

    # curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com
    HTTP/1.1 200 OK
    Content-Type: text/html; charset=utf-8
    Connection: keep-alive
    Date: Thu, 03 Nov 2016 15:50:13 GMT
    Content-Length: 361168
    Vary: Accept-Encoding
    Age: 294
    Pragma: public
    Server: nginx
    Accept-Ranges: bytes

    禁止特定UA后,访问结果:

    # curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com
    HTTP/1.1 403 Forbidden
    Server: nginx
    Date: Thu, 03 Nov 2016 15:55:17 GMT
    Content-Type: text/html
    Content-Length: 162
    Connection: keep-alive

    对比两次结果,发现:nginx已经能禁止特定的UA访问了。

    补充:

    观察一阵子后,发现还有禁止UA为空的访问和放行内网ip不做禁止的需求。

    nginx的配置中不支持if条件的逻辑与、逻辑或运算 ,并且不支持if的嵌套语法,但我们可以使用变量达到想要的效果。

    #白名单:192.168.1
    #禁止特定UA和UA为空的访问
    
    set $flag 0;
    
    if ($remote_addr !~ "^(192.168.1)"){
    set $flag "${flag}1";
    }
    
    if ($http_user_agent ~ "Lua|^$"){
    set $flag "${flag}2";
    }
    
    if ($flag = "012"){
    return 403;
    }

    注意:以下的写法是错误的!!!

    if ($remote_addr !~ "^(192.168.1)" && $http_user_agent ~ "Lua|^$") { 
        return 403; 
    }
  • 相关阅读:
    UVA 12338
    最短路问题
    菜鸟调错(十)——启动Tomcat报错“Unsupported major.minor version xxx ”
    Servlet总结(一)
    <html>
    Android Developer:Allocation Tracker演示
    H2数据库集群
    安卓通过广播自己主动回填短信验证码
    江湖问题研究-- intent传递有没有限制大小,是多少?
    spring 配置文件被加载两次
  • 原文地址:https://www.cnblogs.com/hjqjk/p/6028775.html
Copyright © 2011-2022 走看看