找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 168|回复: 16

我也来发一下防CC攻击的代码

[复制链接]

11

主题

38

回帖

125

积分

注册会员

积分
125
发表于 2010-6-14 00:46:17 | 显示全部楼层 |阅读模式
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开发语言了。
  • 回复

    使用道具 举报

    29

    主题

    524

    回帖

    1157

    积分

    金牌会员

    积分
    1157
    发表于 2010-6-14 00:47:14 | 显示全部楼层
    像这种攻击很难防住,流量一大就完蛋
    回复

    使用道具 举报

    48

    主题

    4124

    回帖

    8432

    积分

    论坛元老

    积分
    8432
    发表于 2010-6-14 00:58:17 | 显示全部楼层
    没有很好的解决方案
    回复

    使用道具 举报

    303

    主题

    3568

    回帖

    8105

    积分

    论坛元老

    积分
    8105
    发表于 2010-6-14 01:22:22 | 显示全部楼层
    已经没被C了
    回复

    使用道具 举报

    327

    主题

    3676

    回帖

    8367

    积分

    论坛元老

    积分
    8367
    发表于 2010-6-14 08:03:00 | 显示全部楼层
    高深··
    回复

    使用道具 举报

    26

    主题

    143

    回帖

    396

    积分

    中级会员

    积分
    396
    发表于 2010-6-14 09:30:49 | 显示全部楼层
    收藏下。。
    回复

    使用道具 举报

    27

    主题

    3325

    回帖

    6775

    积分

    论坛元老

    积分
    6775
    发表于 2010-6-14 09:35:11 | 显示全部楼层
    好像没人说怎么用py开发web,都是什么php asp,楼主去哪里学的啊?

    貌似gg赠送的那个app空间是用py的
    回复

    使用道具 举报

    283

    主题

    6396

    回帖

    1万

    积分

    论坛元老

    积分
    13699
    发表于 2010-6-14 09:49:35 | 显示全部楼层
    不会py
    回复

    使用道具 举报

    25

    主题

    1091

    回帖

    2269

    积分

    金牌会员

    积分
    2269
    发表于 2010-6-14 10:06:04 | 显示全部楼层
    写个middleware套上去,写函数不是好办法.......另外cache有incr方法的................用不着自己去+1的....
    回复

    使用道具 举报

    0

    主题

    1

    回帖

    4

    积分

    新手上路

    积分
    4
    发表于 2010-6-14 10:14:02 | 显示全部楼层
    iptables 的 recent 或者hashlimit 模块不也是可以限制单位时间内的访问次数吗?
    用Web程序来限制,效率比不上用iptables 吧?web来判断,本身就在被CC~~

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Discuz! X

    GMT+8, 2025-1-11 20:43 , Processed in 0.026560 second(s), 5 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表