黑客教你盗微信零钱  纪录一次面对ddos盗刷微信企业支付的经历

访客4年前关于黑客接单1166

纪录一次面对ddos盗刷微信企业支付的经历

这次的文章属于对于之前在工作中发生的一次ddos攻击应对分析和应对经验.很有意思.虽然可能对于大多数的读者和我本人来说这样的事件可能不会在一次发生.但是有一句话说的很好(ps这一句话是我经常看的一个公众号架构师之路里面写的,给大佬的公众号打一个广告).

思路比结论重要,有收获就是好的。

事件

这次是我们公司开发的一个微信公众号,里面有一个答题抢红包的模块.需要用户答题成功后,领取红包,按照设定的代码是根据设置,每天最多拿一个.但是某一天,商务那边拿了微信企业钱包的纪录过来说被别人盗刷了,在短时间内同一个用户密集的领取红包.

然后开始查询日志,确实在凌晨,有用户使用同一个ip密集的访问领取红包的接口,并顺利躲过每日领取一个的检查.

分析

如果当时ddos的攻击的话,可以购买对应的云服务进行防御.但是代码里面肯定还是存在问题.

我个人还怀疑,这些黑客,只是顺手进行尝试盗刷.当然这些也只是猜测

并不准备放上原始的代码.只是大体描述一下代码的逻辑

  • 首先是数据库.这里有一张领取记录表,大概是字段是用户id,领取金额,领取时间

然后发放红包代码逻辑的伪代码是这样的

$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防御还是效果很好.

经验

在这次的事件后我进行了总结

  • 对于关键性质的代码,尤其是涉及到金钱的代码要慎之又慎
  • 在测试,可以借助ab之类的工具,检查这一类关键接口是否会在高并发访问下出现问题

相关文章

qq红包怎么发?在QQ空间发问答红包的方法

qq红包怎么发?在QQ空间发问答红包的方法

手机QQ版本更新后,红包的玩法也更多样,其中,空间的问答红包就是比较受人们欢迎的一种玩法,只有回答问题后才能领取红包。 操作方法 01 打开手机QQ,进入动态页面,然后点击左上角的“好友动态”。...

朋友圈秋天的第一杯奶茶什么梗?微信52元520元红包是什么意思?

朋友圈秋天的第一杯奶茶什么梗?微信52元520元红包是什么意思?

朋友圈秋天的第一杯奶茶什么意思?最近在微信上有人发红包52或者是520,里面配的文字是秋天的第一杯奶茶,很多人对这个梗一头雾水,不清楚秋天的第一杯奶茶什么意思,下面就来为大家详细的介绍一下秋天的第一杯...

微信红包怎么提现不收一分钱手续费的方法(一

微信红包怎么提现不收一分钱手续费的方法(一

最近微信升级了,微信余额提现需要手续费,其实小编大多数的客户给我打款都是通过微信,这样一来,一个月手续费都很高不划算,相信很多朋友和我一样,那么我们如何做到微信红包提现不收一分钱手续费并且一分钟到账呢...

微信春晚红包交税1亿元

微信春晚红包交税1亿元

央视春晚摇一摇我们发了5亿,交了1亿的税。单纯的C2C红包是不需要纳税的,因为非常小额。但是这个将来也不好说。 全国人大代表、腾讯公司董事会主席兼首席执行官马化腾表示,B2C的红包,比如央视春晚...

微信红包怎么提现?教你春节免费提现的方法

微信红包怎么提现?教你春节免费提现的方法

年底了,微信红包越来越多,可提现都要收费,好心疼…… 不要急,二姐继续为你支招…… 目前,微信还信用卡还是免收手续费! 大家可以充分利用这点,外加不少银行信用卡“溢...

明日上映!熊强携红包迎新春 合家欢电影《熊出

过年带娃必看的动画电影《熊出没·狂野大陆》将于明日登陆全国院线,今日(2月11日)片方发布一张“红包雨”版海报,灿烂夜空中,鞭炮纸屑变福气红包,“熊强”喜气洋洋迎新年抢红包,那么,「手气最佳」会花落谁...