跨境业务的短信验证码接口被刷,最常见、也最费钱的情况通常不是数据被盗,而是短信话费欺诈,英文叫 SMS Pumping,也叫人为灌量(AIT)或 Toll Fraud。攻击者利用你公开的注册、登录、找回密码接口,向高费率地区的号码大量触发短信,再和当地运营商分国际结算费。这笔账单由你来付。
如果只能先做几件事,下面这个顺序通常最划算:
- 在短信网关层只开放真正有业务的国家和地区;
- 发码前加人机验证,并确认请求来自完整的页面流程;
- 按手机号、IP、设备分别限频;
- 按国家设置每小时、每天的发送上限和预算熔断;
- 盯住“发送量和验证通过率”的对比,出现异常就自动限流。

下面逐层说明每一步防的是什么、怎么设置,以及哪里容易误伤真实用户。
先分清你在防哪一种攻击
验证码接口常见的攻击有三种,特征和防法都不同:
- 话费欺诈:攻击者要的是“发送”这个动作本身。目标号码多集中在高费率国家的特定号段,常常是连号或成片的假号码,收到码之后也不会去验证。
- 短信轰炸:借你的接口骚扰某个真实用户,同时消耗你的配额。典型特征是同一个号码被反复请求。
- 暴力穷举:攻击者在猜验证码。典型特征是同一号码的校验请求特别多。
前两种要靠“少发、不乱发”来防,第三种要靠限制校验次数和缩短验证码有效期。很多团队只做了按号码限频,能挡住轰炸,却挡不住话费欺诈。原因是攻击者轮换大量号码,每个号码只发一两条。
第一层:关掉不做业务的国家
这是见效最快的一步。话费欺诈要把短信引到偏远的高价号段才能获利。你在当地没有业务,就没有理由往那里发短信。你可以在短信服务商的控制台或自己的网关层设置国家白名单,名单外的国家直接拒发。
对开放的国家,再按国家分别设置单小时、单日发送上限和预算阈值,触顶后自动暂停。阈值可以参考该国过去几周的正常峰值,并留出余量。大促或集中投放前记得临时调高。
有一种例外:有些产品的用户本来就分散在很多国家,比如旅行、留学类产品,一刀切会挡掉真实用户。这时可以对非核心国家默认开放,但把阈值压低,同时对这些国家使用更严格的人机验证。
各家服务商自带的防刷能力和配置方式不一样。比如 Twilio 提供针对 SMS Pumping 的防护选项,阿里云、网易云信也有国际短信防盗刷相关设置。建议先确认自己接入的那家已经有什么,再决定哪些需要自己补上。
第二层:发码前确认对面是人
“发送验证码”不应该是任何人都能直接调用的裸接口。
- 人机验证:用户点击“获取验证码”之前,先过滑块、图形验证码或无感的行为验证。风险高时,再升级为需要交互的验证。
- 绑定页面流程:用会话或 CSRF 令牌把发码请求和页面流程绑在一起。服务端只接受先打开过注册页、拿到令牌的请求。令牌一次性使用、短时间内有效。这样脚本直接调接口就会被拦下。
- 设备指纹:攻击者常用轮换的住宅代理 IP,只靠 IP 黑名单很快会失效。设备特征相对稳定,可以把同一台设备换着 IP 发出的请求归到一起。
第三层:多维度限频
只按一个维度限频很容易被绕开,建议同时做下面几种。以下数值只是起步参考:
- 单号码:两次发送至少间隔 60 秒,之后的重试间隔逐步拉长(指数退避);再设一个单日上限。
- 单 IP 或网段:限制短时间内的总请求数。同一网段请求集中时,提高人机验证难度。
- 单设备:结合设备指纹,限制一台设备一天内能为多少个不同号码请求验证码。这一条对付“每个号码只发一次”的话费欺诈最有效。
- 校验次数:同一条验证码只允许输错有限次,超过就作废,并给验证码设较短的有效期,用来防穷举。
上线后要对照真实用户的重试情况调整这些数值。海外用户信号差、重发多,限得太紧会先误伤他们。
第四层:发之前先检查号码
- 格式校验:先按 E.164 格式检查,国家码和号码长度对不上的直接拒绝。
- 运营商查询与风险评分:接入 Carrier Lookup 一类的服务,识别高费率增值号码、空号和高风险号段,再按你的策略拦截。
- 连号和聚集:短时间内出现一串相邻号码,或同一号段大量请求,多半是批量假号码。
要不要拦截虚拟号码或 VoIP 号码,取决于你的业务,并不是越严越好。支付、金融或强调一人一号的平台,常常要求本土运营商的实体卡或 eSIM 号码。社区、工具类产品如果一律拒收,会挡掉一部分正常用户。两类号码的区别可以参考什么是VoIP电话号码:它怎么工作,为什么常收不到验证码。
第五层:盯住验证通过率,异常就熔断
最有用的监控指标是 OTP 转化率,也就是发出去的验证码里,有多少在几分钟内被正确提交。正常用户收到码后多半很快完成验证;话费欺诈用的号码收到码也不会去验证。
看板至少要按国家、按号段展示发送量和通过率,并配置自动规则,例如:
- 某个国家的发送量明显高于平时,同时通过率骤降到接近 0,就自动对该国家限流或暂停,并通知值班人员;
- 某个号段集中出现高频请求,就自动提高验证难度或封禁该号段。
只发告警是不够的,熔断最好自动执行。攻击常常发生在深夜,等有人看到告警时,账单可能已经产生了。
给高风险请求换一条路
对多次重试、风险评分高或来自高费率国家的请求,不一定非要发国际短信。可以改用邮箱验证码、WhatsApp OTP 或语音验证,或者引导用户用 Passkey(WebAuthn)免密登录。这样既能降低单次验证成本,也少了一个能被刷的出口。替代渠道同样要套用上面的限频和监控。
收紧规则后,用真实号码回归一遍
规则越多,误伤正常用户的可能越大。比如白名单漏了某个国家,号码类型策略拦掉了正常的运营商号码,或者限频挡住了正常的重发。上线前后,最好在每个开放的国家用真实本土号码完整走一遍注册、登录和找回密码,确认验证码能送达,频控提示也正常。
如果团队手上没有各国的本地号码,可以在 NexSMS 按国家挑选号码,在网页上实时查看验证码。一次性检查用短效号码就够了。需要定期回归测试的,可以用长效精品号码:它们是真实运营商的本土号码,有效期内可以不限次接码,适合固定作为测试号,但要在到期前续费才能继续持有。两种号码的区别和续费条件见NexSMS 功能说明。这些号码只用于测试你自己的产品流程。
已经被刷了:先止血,再排查
- 立即在网关暂停异常国家或号段的发送,或者临时要求所有发码请求必须先过人机验证;
- 设置或调低各国家的预算上限;
- 导出发送日志,按国家、号段、IP、设备聚合,找出攻击特征,补进上面的规则;
- 联系短信服务商,说明异常流量情况,确认对方有哪些处理机制和防护选项。
NexSms官方博客
评论(0)