Skip to content

有人恶意攻击我们的注册功能,伪造手机号大量下发验证码,除了限流之外,如何解决这个问题? ​

  • 标签:后端、场景题

🏛 业务架构师 ​

恶意伪造手机号刷验证码——这是真金白银的资损:一条短信 3~5 分钱,被脚本刷一晚上就是几万条、几千块,还伴随对正常用户的骚扰(轰炸)和品牌伤害(被投诉标记)。限流之外我答一套组合拳,并且强调预算熔断是最后的钱袋子。

第一层:入口人机校验(抬高脚本成本)

  • 发送前强制滑块/行为验证码:人能过、脚本难过,成本最低的第一道墙
  • 设备指纹:同一设备反复换手机号发短信 = 明确恶意,直接拒绝

第二层:多维度频控(超越简单限流)

  • 手机号维度:1 分钟 1 条、24 小时 5 条
  • IP/设备/账号维度:单 IP 每日上限(手机流量 NAT 场景注意误伤,阈值放宽 + 组合判断)
  • 号段识别:虚拟运营商号段、接码平台常用号段库(风控数据源,命中率极高)
  • 图形化异常:同一 IP 提交上百个不同手机号 = 接码平台刷注册,直接封

第三层:产品流程设计(让刷没有意义)

  • 上行验证(回填确认):要求用户回复短信或输入收到的验证码才能继续下一步——刷子只想消耗你的下发量,拿不到验证码就没意义
  • 注册流程前置风控:可疑注册进入人工审核而非直接放行

第四层:预算熔断(兜底闸门)

  • 通道日发送量预算(如日常 3 倍),到达即自动停止下发并告警
  • 单用户被轰炸识别(短时间大量请求同一号码 → 静默处理 + 通知用户)

收尾:防护分级应对——业务上要评估"防到什么程度":金融级产品全量上(短信成本占比高),普通社区产品做到验证码 + 基本频控即可。被刷后除了止损,还要复盘告警响应时间:发现晚一小时就是几千块,监控告警本身是方案的一部分。

🏗 系统架构师 ​

限流之外,我把防轰炸体系分成事前准入、事中识别、事后追溯三道防线,目标是把发短信的成本(钱+用户骚扰)打到最低。

第一道:发送资格准入(提高攻击成本)

  1. 人机验证前置:发验证码前必须通过行为验证码(滑动/点选,收集轨迹特征判断机器),把脚本挡在进门前——这是最有效的一层
  2. 图形/语义挑战升级:可疑用户升级到短信语音验证或倒计时(30s),正常用户无感,攻击者效率骤降
  3. 手机号合法性:号段校验(虚拟运营商、空号检测)、接码平台号段库比对(黑产常用号段有公开特征库)

第二道:多维度频控(比简单限流精细) 限流的"维度组合"才是精髓,单 IP 限流不够(黑产代理池万级 IP):

  • 单手机号:1 分钟 1 条、1 小时 3 条、24 小时 10 条(阶梯)
  • 单 IP:每小时 N 条(但别设太死,公司出口 NAT 会误伤)
  • 单设备指纹:Web 端 canvas/WebGL 指纹、App 端设备 ID,比 IP 稳定得多,一机多号直接拦
  • 单账号/单行为链:未完成注册流程却反复发码的用户标记
  • 全局维度:单日验证码总量熔断——超过预算直接停发并告警,保住钱袋子

第三道:黑产对抗与追溯

  1. 风控模型识别:设备指纹聚类(一台设备刷百个手机号)、行为序列分析(注册-发码-放弃的异常链路)、IP 信誉库,命中直接拉黑
  2. 业务逻辑防护:验证码 5 分钟有效+一次性;验证成功才放行后续,验证失败的码立即作废
  3. 蜜罐与追溯:埋蜜罐接口收集黑产特征;短信通道按业务分签名(主号段被攻击不影响登录通道);事后从日志追责

兜底:与短信服务商设置日配额告警,半夜被刷能自动熔断而不是天亮看到账单。

💻 全栈开发专家 ​

限流只是挡量,我加五道防线组合治理,目标是让恶意请求根本到不了"发短信"这一步。

1. 行为验证码前置(最有效)

发验证码前必须过滑动/点选验证码,机器自动过码成本陡增,能拦掉绝大多数脚本。关键是行为轨迹分析(见验证码题),不是静态拼图。

2. 手机号维度治理

  • 有效性校验:正则 + 空号/虚拟号/风险号段检测(运营商三要素接口或第三方风险库),物联网卡、接码平台号段直接拒绝。
  • 黑名单:被投诉/标记骚扰的号码、频繁触发风控的号码进黑名单。
  • 一个手机号:1 分钟 1 条、1 小时 3 条、24 小时 5 条(阶梯频控)。

3. 请求源维度频控

同 IP、同设备指纹(device id)、同 user-agent 的发送量限制;IP + 设备双命中直接熔断该来源。

java
// 多维频控,Redis Lua 原子判定
boolean ipOk   = limiter.allow("sms:ip:" + ip, 20, 3600);
boolean devOk  = limiter.allow("sms:dev:" + devId, 10, 3600);
boolean phOk   = limiter.allow("sms:ph:" + phone, 5, 86400);
if (!(ipOk && devOk && phOk)) throw new BizException("操作过于频繁");

4. 业务侧防滥用

  • 图形验证码答错 3 次锁定该会话;同账号切换多个手机号发码触发风控。
  • 发送量与成本熔断:当日短信总量超阈值自动停发并告警(资损保护),通道成功率骤降自动切换备用通道。

5. 监控对账

发送量分钟级同比告警;对接投诉渠道,被轰炸号码快速回访 + 加黑。防轰炸是持续对抗,规则要能热更新。