INCR captcha:fail:13800138000
EXPIRE captcha:fail:13800138000 600

安全扫描报告显示,同一个手机号的六位验证码接口一分钟能提交 200 次,没有锁定也没有验证码,六位数字理论上十七个小时就能穷举完。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,校验接口只比对缓存里的值,错误次数没计数,也没有按手机号或 IP 做窗口限制。验证成功后删除键,失败却什么都不做。

「验证码尝试次数」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:每个手机号记一个失败计数,五次错误就锁定十分钟;同一 IP 每小时最多提交三十次,超过直接返回 429;锁定期间连正确验证码也拒绝,避免被用来探测。

改完只确认一件事:连续输错五次后接口返回锁定提示,第六次即使输对也不通过。

作者 9823189