问题

一个非理性的需求:在不使用短信验证的情况下凭手机号码赠送电子券码

Day 1

使用IP防止用户刷接口获取电子券码

思路:

记录每次访问日志,业务处理前先查询IP访问次数,超过3次视为攻击,返回出错信息

结果:

上线半天就被刷子盯上,5000个码瞬间被刷完,后台记录是不同的IP,看来刷子的技术水平还可以,懂得用伪造IP刷接口

Day 2

使用极验强制用户先完成智能验证

思路:

IP不保险,只能上验证了,也可以用图片验证码,考虑到用户体验,还是去试用了一下极验的产品

而且使用微信OPENID作为UserID,看起来很牢固了,用户只能在微信浏览器环境下操作

结果:

上线后看起来正常,到晚上又被刷子破解,使用有效的验证过的验证码重复刷接口,5000个码瞬间被刷完,后台记录是相同的相同的OPENID,看来不是刷子的技术水平可以,是我的水平不行

Day 3

绑定微信OPENID和获取的手机号

思路:

一个OPENID只能用来对应一个手机号码,一个手机号码只能取一个码,这样变相建立了用户体系

结果:

暂时刷子还没有找到办法,从技术上应该比较完美了

Day 4

再次验证微信OPENID是否匹配

思路:

刷子用伪造的OPENID,破解了极验的算法,直接来刷接口了,而我居然还是想偷懒,没有二次验证微信OPENID

结果:

结果还不敢说

证明极验不靠谱

心得

  • 道高一尺,魔高十尺
  • 一定要做小范围测试,一定要记录日志,一定要自己攻击测试(说说而已,那有时间)
  • 在技术上偷懒,只会让自己变得更忙
  • 技术储备要跟上,构建一个商业项目,有些底层的东西是跑不掉,总有一天你会用上

参考

  1. 安装Geetest智能验证
  2. 微信公众号开发取OPENID