最近公司的验证码接口被恶意刷,为此上线了各种各样的防刷策略。
生成验证码的逻辑很普通:当接收到请求的时候,检测 mobile 在 DB 中是否存在发送记录,如果没有,新建一条记录,mobile 为主键。插入记录在事务中,如果调用短信网关失败,会执行回滚。
当接口被恶意刷、请求密集的时候,同一个手机号前一条记录还未插入成功,后面的记录再执行插入会提示主键冲突。为了保证接口始终能正常返回(主要是主键冲突后会产生一个500错误,运维系统不断告警惊动了大佬= =),将操作DB的代码用try/catch 进行处理。
看起来非常简单的一个改动,try/catch Exception后 phpStorm 自动补全依赖 ,打算简单自测后上线。谁知道模拟密集请求的时候接口还是报错了,try/catch 未能捕获到错误。
排查后发现 phpStorm 自动补全依赖的时候引入的是 yii\base\Exception
:
1 | use yii\base\Exception; |
修改成 \Exception
后解决。
1 | use \Exception; |