短信验证码如何防盗刷
一、背景
用户在接入短信业务时,由于注册验证码接口常常暴露在外,经常遇到验证码接口被攻击的情况,造成经济损失和业务中断,常见的攻击场景包括:
- 接口同一个手机号被反复请求
- 接口被批量调用
- 用户注册验证码和登录态的验证码逻辑未进行隔离
二、解决方法
为减少用户损失和业务正常,建议从以下方面进行排查和加固。
供应商侧的限制只能起到有限的作用,建议用户从以下方面进行加固 2.1 接口与流程安全性检查
- 【必选】验证码发送接口是否具备服务端 Token 校验
- 临时 Token(由服务端下发)
- Token 在请求时校验是否经过正确流程生成
- 估针对注册接口是否进行隔离,不要因为注册接口影响到其他业务
- 是否能从你的 App 外部,通过抓包构造请求直接触发验证码发送
- 验证请求来源,识别非法请求
- 【必选】验证码请求是否绑定了客户端的关键参数?比如:
- App 版本
- DeviceID
- 会话 token
- 时间戳签名 2.2 限频策略审查
- 【必选】是否对“手机号”设置了发送频率限制?(例如:1 分钟 1 次、10 分钟 3 次、24 小时 10 次)
- 【必选】是否对“设备”设置了限频?(例如:同设备每日最多 10 次 OTP)
- 是否对“IP”设置限频 2.3 人机验证 & 风控审查
- 是否在高频触发、异常行为时要求图形验证码/滑块?
- 无此步骤非常容易被简单脚本暴力触发。
- 【必选】是否接入了人机识别(如 hCaptcha / 防刷 SDK)?
- 如果没有,那自动化脚本能轻松模拟流程。
- 是否有设备指纹,用于识别模拟器、爬虫、易变设备?
- 90% 短信盗刷都用模拟器
- UI层增加手机号验证码发送冷却时间60秒 2.4 号码安全性检查
- 是否对输入的手机号做基础校验(区号、长度、正则)?
- 是否识别手机号码类型?
- 如:Mobile、Landline、VoIP(VoIP 极容易被滥用)
- 是否有风险号码库(黑名单)?
- 比如:接码平台号码、常用刷号区号。 2.5 请求来源与行为分析
- 在日志中记录每条验证码请求的:设备指纹、IP、会话 token、UA、手机号,这是定位盗刷的关键。
- 多次发送 → 多次失败 → 自动拉黑
- 是否有检测异常模式?例如:
- 某设备对多个手机号发送
- 某手机号被大量请求
- 请求节奏规律(机器行为)
- 是否有“未注册完成就反复获取验证码”的自动告警?
- 当出现小规模攻击(某手机号被集中轰炸)时,有没有自动加严策略?
- 例如:自动要求滑块、人机验证。 2.6 发送流程防重放与安全性
- 验证码是否有“场景限制”?
- 例如:注册 OTP 不能用于找回密码。
- 验证码是否有并发保护?
- 同号码同时发出两个请求时,是否只会触发一条短信?