压测时同一手机号一分钟收到 8 条验证码,接口全部返回 200。限流规则只有按 IP 每分钟 20 次,换 IP 就能绕过去。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,限流维度只做了 IP,没有按手机号和设备维度。攻击方换代理 IP 就能继续打同一个号码。发送接口本身没有二次校验,只要参数合法就发。
「发送频率限制」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。
SETEX sms:limit:13800138000 60 1 NX # 返回 OK 才允许发送 nil 表示 60 秒内已发过
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,加手机号维度限制 60 秒一条 24 小时十条;再加设备指纹和 IP 的组合限制;超限返回明确错误码 不要静默成功;记录发送流水 便于事后追溯。
最后用这个标准收尾,同一号码一分钟内只收到一条,换 IP 重放同样被拦,接口返回 429 和剩余等待秒数。
