关于反爬虫和恶意攻击的一些策略和思路

て烟熏妆下的殇ゞ 提交于 2019-12-02 22:56:12

    前段时间Guang.com经常受到恶意spider攻击,疯狂抓取网站内容,一系列机器人spam发广告,对网站性能有较大影响。

        下面我说说一些反恶意spiderspam的策略和思路。

    1. 通过日志分析来识别恶意爬虫/攻击

less guang.com_access.log | awk -F- '{print $1}' | sort | uniq -c | sort -rn | head -n 50

    首先分析access log,类聚统计出访问量前50 IP

     排除白名单IP 和正常spiderbaidugoogle...)

host 112.94.32.135 //查看可疑ip是不是baidu、google等常规爬虫。

     分析可以ip 请求时间、频率、路径等,你可以很容易发现这是否是一个spider,下面那明显是一个spider

    less access.log | grep '112.94.32.135' | less

    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1888476 HTTP/1.1" 200 107876 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1922742 HTTP/1.1" 200 110053 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437104 HTTP/1.1" 200 10751 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1733527 HTTP/1.1" 200 98099 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437105 HTTP/1.1" 200 10891 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1646377 HTTP/1.1" 200 95527 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437106 HTTP/1.1" 200 10681 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1922741 HTTP/1.1" 200 98356 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1733526 HTTP/1.1" 200 97690 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /u/1437107 HTTP/1.1" 200 10765 "-" "Mozilla/4.0"
    112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1888475 HTTP/1.1" 200 96415 "-" "Mozilla/4.0"

     既然发现spider,当然要动用iptables来封杀这IP, 但很多时候仅仅封一个IP是不够的,因为一般爬虫都是运行在托管机房里面(多台服务器轮换)或者家里ADSL(重新拨号换IP),所以封整个C网段会直接有效得多,当然这样做有可能影响极小数正常用户访问,所以建议一段时间后重新解封这c网段。

 iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 112.94.32.0/24

        以上可以写成个shell/python脚本,每天执行一次。

    2. 实时反爬虫

        过日志分析来识别恶意爬虫/攻击,无法即时屏蔽这些spider,对网站影响还是在的。再说,假如有人采用分布式的spider(几百个代理服务器一起过 来爬),网站很有可能无法访问,分析日志也不能及时解决问题。必须采取实时反爬虫策略,实时识别和封锁恶意爬虫的访问。

    实现思路:redis来记录每个IP的访问频度,在单位时间之内,如果访问频率超过一个阀值,就认为这个IP很有可疑,然后就可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话,当然不可能填写验证码,如果该IP地址短时间内继续不停的请求,则判断为爬虫,加入黑名单。

    当然判断这IP是否可疑,单单从访问频率来判断是不够的,还需要增加以下策略:

     分析referer。一般爬虫的referer 都是为空或者一个固定值。

    分析访问时间间隔。一般爬虫爬取网页的频率都是比较固定的,不像人去访问网页,间隔时间比较无规则。

     排除白名单IP地址段。

   具体redis操作:

         //score timestamp, value {referer}{request_url}{sessionId} redis> ZADD log:ip:112.94.32.135 61307510400000 "{referer}{request_url}{sessionId}" (integer) 1 //保留1个小时内log会比较合理。 redis> ZREMRANGEBYSCORE log:ip:112.94.32.135 -inf {timestamp} (integer) 1 redis> ZRANGE log:ip:112.94.32.135 0 -1

    更多Redis 的应用场景,请看Redis 在电商中的实际应用场景

后记

        有同学说,还可以根据User-Agent来屏蔽spider,但我认为这没什么意义,现在的恶意spider都已经将User-Agent伪装成普通浏览器或者正规爬虫的User-Agent了,我也不再这里提了。

    我认为,结合以上2种策略,可以很大程度打击那些恶意spider的攻击,保证网站正常运行。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!