|
CC攻击因为是正常连接,防火墙基本没用,如果用防火墙封单IP多链接,极易误封
如果通过封代理的方式,也容易误封
解决CC攻击的最好办法还是对脚本对耗资源的操作极大可能的用缓存,比如搜索 XX 出来的结果,对这个结果缓存到内存一段时间,
当然数据量比大的时候,还要对结果索引,比如腾讯用户验证的步骤,简单的缓存是没用,还需要快速查找缓存的结果,这个叫快速寻址
如果会这个,都是工程师级的了,那么CC攻击也就不在话下
简单解决CC的问题,就是对某IP访问进行访问计数,这个不太可能误封,可以根据自己网站的内型,对单ip在多长时间内最多允许多少次访问
当然要在耗资源的页面才进行统计,不耗资源的,没人会去CC这个页面,反而会影响正常用户,
如果自己的脚本是FastCGI单进程多线程的,这个最简单,用全局变量对某IP进行访问计数
如果是多进程的,那么把IP访问计数缓存到第三方缓存中去,用的最多的缓存就是 memcached,很多web脚本都有memcached 的扩展
我的网站是用nginx+python+django+flup的,下面的代码只适合用python的。
用其他脚本可以根据下面的思路,自己改
python语言我就不解释了,很容易看懂[ol]from django.core.cache import cache#上面这行的cache就是django对python-memcached 的封装def checkcc(RemoteAddr, maxreq = 30, pertime = 60, bantime = 300): #在pertime时间内,最多允许maxreq次连接,如果超过,则封bantime时间,RemoteAddr是用户IP try: chklist, banlist = 'ccchk' + RemoteAddr, 'ccban' + RemoteAddr banflag = cache.get(banlist) if not banflag: cache.set(banlist, 1, pertime) cache.set(chklist, 1, pertime) return False elif banflag == 1: reqs = cache.get(chklist) if not reqs: cache.set(chklist, 1, pertime) return False reqs += 1 if reqs > maxreq: cache.set(banlist, 2, bantime) return True cache.set(chklist, reqs, pertime) else: cache.set(banlist, 2, bantime) return True except: pass return False[/ol]复制代码上面的代码,可以解决小数量的肉鸡的CC攻击,如果碰到1000台肉鸡CC怎么办?
那么只有封掉全部代理,误封也没有办法,
封代理的方法比较简单,就是检查代理的 Header, 对比一下没用代理的 Header 和用了代理的 Header 就知道。
再不行的话,那就只有增加硬件了,上小型机,呵呵。
我这个贴只是起一个抛砖引玉的作用,欢迎大家讨论
PS,python是好东西啊,比其他的简单,而且效率又不会低,我自认为是目前性价比最高的WEB开发语言了。 |
|