这次的文章属于对于之前在工作中发生的一次ddos攻击应对分析和应对经验.很有意思.虽然可能对于大多数的读者和我本人来说这样的事件可能不会在一次发生.但是有一句话说的很好(ps这一句话是我经常看的一个公众号架构师之路里面写的,给大佬的公众号打一个广告).
这次是我们公司开发的一个微信公众号,里面有一个答题抢红包的模块.需要用户答题成功后,领取红包,按照设定的代码是根据设置,每天最多拿一个.但是某一天,商务那边拿了微信企业钱包的纪录过来说被别人盗刷了,在短时间内同一个用户密集的领取红包.
然后开始查询日志,确实在凌晨,有用户使用同一个ip密集的访问领取红包的接口,并顺利躲过每日领取一个的检查.
如果当时ddos的攻击的话,可以购买对应的云服务进行防御.但是代码里面肯定还是存在问题.
我个人还怀疑,这些黑客,只是顺手进行尝试盗刷.当然这些也只是猜测
并不准备放上原始的代码.只是大体描述一下代码的逻辑
然后发放红包代码逻辑的伪代码是这样的
$count = $this->countpackactive( ['member_id' => $memberid, '@date_format(createtime,"%Y-%m-%d")'=>date('Y-m-d')]);//获取当前用户当日获取的次数 if($packactiveinfo['pack_membernum'] - $count == 0){ $this->dataerror('今日答题次数已用完!'); } ... ... //调用企业支付接口. $this->addquestionmember_datetime (['quest_tradenumber'=>$tradenumber,'status'=>1]);//insert领取表,增加当前用户的当日的领取次数 ...
上面的代码的思路还是蛮清晰的.但是在并发测试下就出现了盗刷的问题.原本的检查完全失败.那么问题出在哪里?我们在简化上面的代码
$count = $db->count('question_member',$where); if ($count ....) ..... $db->insert('question_member',$set); .....
我们看到这么一个逻辑先检查question_member表,在插入question_member.用一定的数据库经验的朋友可以看出来来这里出现了资源的占用的问题.在之一次访问question_member插入完成之前,第二个接口访问到来,要求检查当前question_member的情况.这里有点类似事务处理里面的幻读.
这里其实并不像夸夸奇谈,我先说的是这一类的问题其实在计算机的各个层面的都是通用的,不仅仅是数据库中,在操作系统中也见到过注入资源的强占问题,在 *** 层中出现的一致性问题.而这些问题的解决思路往往很详尽.
而在这里的方案是增加一个锁,在增加当前用户日领取记录时候使用锁,而在读取时候必须等待之前的记录插入完毕才能读取.
上面的是之一套方案,当然很快被领导否定了.技术主管提出现在的行业中不流行使用锁(我对于这一点抱有疑问)
然后提出第二套方案,使用redis进行每天的日访问记录进行检查.大概的逻辑是这样的
$count = $redis->get( 'question_member:' . $time . ':' $memberid );//获取当前的访问数目 if($packactiveinfo['pack_membernum'] - $count == 0){ $this->dataerror('今日答题次数已用完!'); ... ... $redis->set('question_member:' . $time . ':' $memberid, $count+1); 发放红包,如果失败回滚;
这里的使用逻辑是通过redis原子访问特性(redis是原子化,必须等一个访问结束后才有第二个发文),速度快的特性避免了高并发下出现的资源占用问题.
其实这里还是会出现资源的占用,只不过因为redis的响应特别快,从而不会轻易出现,在一次插入结束前,继续访问接口.(平心而论还是有地雷的).但是配合ddos防御还是效果很好.
在这次的事件后我进行了总结
很多朋友在使用电脑的过程中,都遇到过电脑蓝屏问题,有的蓝屏多重启几次就可以解决的,有的蓝屏可不是简单靠重启就能解决问题的,今天快启动小编就给大家分享一下常见的五种电脑蓝屏问题及其解决办法,希望能对你有...
看到京东、唯品会、凡客等大型电商网站的左侧导航了吗,是不是很精彩呢,这种导航在用户体验上方便了用户的查找,无论是从SEO角度还是网站的实用形式都是非常友好的。下面是导航的演示与下载地址。 下载地址:...
SEO优化是一个注重细节的工作,对于一个成熟的企业网站而言,SEO优化网站代码优化,是每个SEO优化人员都必须审查的一个过程,而在实际操作中,却经常被忽略。特别强调的是在做网站代码优化的过程中,多...
剑与远征Uzi兑换码是什么?剑与远征近日公布了新的代言人Uzi,而这位全新的形象代言人也为我们带来了三重好礼,也就是三个礼包兑换码,玩家领取后可以在游戏中兑换单抽券、钻石、金币、英雄粉尘等资源,小伙伴...
一个漂亮的客服代码能够直接影响到一个网站的形象,那么今天给大家分享的是一个可伸缩的在线客服代码,适用于商城站点。本页为客服代码的演示地址 下载地址:http://pan.baidu.com/s/1o...
剑与远征3000钻石兑换码是什么?剑与远征今天发布了《先锋服秘宝峡湾活动的奖励调整与说明》,同时发放了一个含有3000钻石的神秘代码,小伙伴们可以在8月6日之前进行兑换。下面就是这个兑换码了,大家快来...