最近网站一直受到恶意请求和攻击,把最近限制防护历程记录一下:
1、请求次数超过阈值做限制
刚开始网站并没有受到攻击,但有一些恶意抓取网站数据的爬虫,为了防止别人抓取本网站数据,做了请求次数限制,具体思路就是,单位时间内,请求次数超过设定的阈值,自动转向验证码页面,验证通过后可以继续访问,这样既不影响正常访问者,也可阻挡机器请求。
技术实现方式:刚开始的想法时,每次访问请求时,使用数据集记录IP的请求数量和时间,这样做比较麻烦,不但需要定时清空过时的数据,还要对比时间。然后改用缓存模式,缓存本身有过期时间设定,这样就避免了定时清数据的操作,并且速度快,然后使用IP作为key,访问次数作为value。每次访问请求时,根据IP获得缓存数据,如果获不到数据,创建该缓存,同时设定缓存有效期(阈值有效期),如果获得数据,累加访问次数,如果累计的次数超过阈值,转到验证页面,验证成功,阈值清零,可继续访问。
这样的方式,避免了频率比较高请求,但如果别人用比较低的频率抓取数据,也无法防护。另外由于设置的单位时间内阈值比较高,没有考虑搜索引擎爬虫,后来的经验表明,各种各样的引擎爬虫,爬取的速度频率还是比较高的。
2、网站受到恶意攻击
有一天网站突然访问速度很慢,甚至无法访问,然后登录服务器查看服务器状况,发现CPU使用率100%,首先想到的是,可能是代码出现了死循环或者代码质量问题,但最近发布的版本一直很稳定,排除了该可能性。查看系统日志,发现服务器出现大量的数据请求,并且请求的是商品查询页面,整个系统几乎最耗性能的一个操作。还好之前做了数据分离,不直接操作数据库,保证了数据库服务器正常运行。但一个台web服务器还是无法应付几百个IP同时的大量请求(CC攻击),再加上网站有几万的商品,全部请求商品查询页面,网站几乎一下子就瘫痪了。首先想到的是,利用IIS限制IP访问,阿里云服务器竟然没找到该功能,不得已只有利用应用限制,赶紧在程序访问的BeginRequest中做了限制,把这些访问比较多的IP放到黑名单中,总算暂时给限制住了。
然后联系阿里云客服,看看有没有什么方法做限制,他们推荐了web应用防火墙,每天拦截了上万的Web攻击和CC攻击,总算安稳了一段时间。注意:使用Web应用防火墙之后,系统日志获得不了真正的客户IP,需要在IIS里安装F5XForwardedFor.zip
3、网站再次受到攻击
好景不长,网站再次受到攻击,包括恶意的数据抓取,这次IP段更广,并且不在之前的限制名单中,一些IP请求的总次数很少,Web应用防火墙也不再起太多的作用(估计单位阈值达不到触发条件,具体不太清楚触发机制)。我这边分两步走,一是把网站访问限制阈值调的更低,二是限制三位IP,发现大量的IP,前三个都是相同的,唯一不同的是后一位。想到有些限制IP可能是代理,不一定是真正攻击者,不得已,攻击过后,放开限制IP。每次攻击时,重新计算攻击IP,进行限制。
4、搜索引擎也被限制
有一天突然发现百度自然搜索中,网站的关键词快照,全部变成了限制请求了(被限制的IP访问,会返回“限制访问”几个字),在历次的攻击中,虽然想到了可能会限制到搜索引擎的爬虫,但想到爬虫不会请求那么频繁,并且限制后就立即放开了,应该影响不了,虽然可以根据UserAgent判断是否为爬虫,但恶意的也可以伪装成搜索引擎爬虫,就想当然的没处理。直接的后果就是导致了订单量直线下降。最后查询快照那天的百度爬虫访问日志,正好当时也被攻击,百度当天的访问量将近3000次,远远超过了阈值,被限制了。
了解到各个搜索引擎都有自己的特征,比如百度、谷歌,可以利用IP反查是否属于百度、谷歌,360引擎直接给出了爬虫IP,根据各个搜索引擎特征,在限制时做了改动,增加黑名单、白名单、高频率请求三种组合方式。查询出访问比较高的IP,如果是搜索爬虫特征的,手工验证该IP是否真正属于搜索引擎(利用 nslookup 命令),如果不属于,进入黑名单,否则进入白名单。像360这样的,直接给出IP的,直接放到白名单。
后记:目前仍在观察中,如果谁有更好的访问限制方法,不吝赐教。