设为首页收藏本站

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย french

搜索
热搜: 活动 交友 discuz

我也来发一下防CC攻击的代码 [复制链接]
查看:164 | 回复:16

8

主题

32

回帖

106

积分

注册会员

积分
106
发表于 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开发语言了。
  • 25

    主题

    498

    回帖

    1103

    积分

    金牌会员

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

    45

    主题

    3701

    回帖

    7617

    积分

    论坛元老

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

    299

    主题

    3488

    回帖

    7993

    积分

    论坛元老

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

    295

    主题

    3413

    回帖

    7771

    积分

    论坛元老

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

    22

    主题

    126

    回帖

    358

    积分

    中级会员

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

    26

    主题

    3100

    回帖

    6370

    积分

    论坛元老

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

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

    272

    主题

    6251

    回帖

    1万

    积分

    论坛元老

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

    24

    主题

    1146

    回帖

    2384

    积分

    金牌会员

    积分
    2384
    发表于 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~~

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

    论坛客服/商务合作/投诉举报:2171544 (QQ)
    落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
    拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
    落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
    © 2001-2014

    浙公网安备 33060302000191号

    浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

      落伍法律顾问: ITlaw-庄毅雄

    Archiver|手机版|Discuz! X

    GMT+8, 2026-6-15 17:28 , Processed in 0.016554 second(s), 3 queries , Gzip On, Redis On.

    返回顶部