面试官:如何防止短信盗刷和短信轰炸?

简介: 面试官:如何防止短信盗刷和短信轰炸?

短信盗刷和短信轰炸是项目开发中必须要解决的问题之一,它的优先级不亚于 SQL 注入的问题,同时它也是面试中比较常见的一个经典面试题,今天我们就来看下,如何防止这个问题。

1.概念介绍

短信盗刷和短信轰炸的概念如下:

  • 短信盗刷是指使用某种技术手段,伪造大量手机号调用业务系统,盗取并发送大量短信的问题。这样会导致短信系统欠费,不能正常发送短信,同时也给业务系统方,带来了一定的经济损失和不必要的麻烦。
  • 短信轰炸是指攻击者利用某种技术手段,连续、大量地向目标手机号码发送短信,以达到骚扰、干扰或消耗目标用户的时间、流量与精力的目的。这种行为可能会对受害者造成骚扰、通信中断和手机电量消耗过快等问题。

    2.解决方案

    短信盗刷和短信轰炸属于一类问题,可以一起解决。但这类问题的解决,不能依靠某一种解决方案,而是多种解决方案共同作用,来预防此类问题的发生。

这类问题的综合解决方案有以下几个:

  1. 添加图形验证码:用户发送短信前,需要先输入正确的图形验证码,或拖动验证码等验证,验证通过之后,才能正常发送短信验证码。因为图形验证码的破解难度非常大,所以就避免了自动发送短信程序的执行。
  2. 添加 IP 限制:对请求 IP 的发送次数进行限制,避免短信盗刷和短信轰炸的问题。例如,每个 IP 每天只能发送 10 条短信。
  3. 开启 IP 黑名单:限制某个 IP 短信发送功能,从而禁止自动发送短信程序的执行。
  4. 限制发送频次:一个手机号不能一直不停的发送验证码(即使更换了多个 IP 也不行),设置一个手机号,每分钟内只能发送 1 次验证码;一小时之内,只能发送 5 次验证码;一天之内,只能发送 10 次验证码。
  5. 开启短信提供商的防控和报警功能:几乎所有的短信提供商都提供了,异常短信的防控和提醒功能,开启这些保护措施,可以尽可能的避免短信盗刷的问题。

具体实现如下。

3.具体解决方案

3.1 添加图形验证码

图形验证码的执行流程如下:

  1. 当用户点击“发送短信验证码”的时候,前端程序请求后端生成图形验证码,后端程序生成图形验证码的功能,可以借助 Hutool 框架来生成,它的核心实现代码如下:

    @RequestMapping("/getcaptcha")
    public AjaxResult getCaptcha(){
         
         
     // 1.生成验证码到本地
     // 定义图形验证码的长和宽
     LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(128, 50);
     String uuid = UUID.randomUUID().toString().replace("-","");
     // 图形验证码写出,可以写出到文件,也可以写出到流
     lineCaptcha.write(imagepath+uuid+".png");
     // url 地址
     String url = "/image/"+uuid+".png";
     // 将验证码存储到 redis
     redisTemplate.opsForValue().set(uuid,lineCaptcha.getCode());
     HashMap<String,String> result = new HashMap<>();
     result.put("codeurl",url);
     result.put("codekey",uuid);
     return AjaxResult.succ(result);
    }
    

    上述执行代码中有两个关键操作:第一,生成图形验证码,并返回给前端程序;第二,将此图形验证的标识(ID)和正确的验证码保存到 Redis,方便后续验证。

  2. 前端用户拿到图形验证码之后,输入图形验证码,请求后端程序验证,并发送短信验证码。

  3. 后端程序拿到(图形)验证码之后,先验证(图形)验证码的正确性.如果正确,则发送短信验证码,否则,将不执行后续流程并返回执行失败给前端,核心实现代码如下:
    // redis 里面 key 对应的真实的验证码
    String redisCodeValue = (String) redisTemplate.opsForValue().get(user.getCodeKey());
    // 验证 redis 中的验证码和用户输入的验证码是否一致
    if (!StringUtils.hasLength(redisCodeValue) || !redisCodeValue.equals(user.getCheckCode())) {
         
         
     // 验证码不正确
     return AjaxResult.fail(-1, "验证码错误");
    }
    // 清除 redis 中的验证码
    redisTemplate.opsForValue().set(userInfoVO.getCodeKey(), "");
    // 请求短信 API 发送短信业务......
    

    3.2 添加 IP 限制

    IP 限制可以在网关层 Spring Cloud Gateway 中实现,在 Gateway 中使用全局过滤器来完成 IP 限制,核心实现代码如下:
    @Component
    public class IpFilter implements GlobalFilter {
         
         
     @Override
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         
         
         // 获取请求 IP
         String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
         Long count = redisTemplate.opsForValue().increment(ip, 1); // 累加值
         if(count >= 20){
         
          // 大于最大执行次数
             redisTemplate.opsForValue().decrement(ip, 1); // 变回原来的值
             // 终止执行
             response.setStatusCode(HttpStatus.METHOD_NOT_ALLOWED);
             return response.setComplete();
         }
         redisTemplate.expire(ip, 1, TimeUnit.DAYS); // 设置过期时间
         // 执行成功,继续执行后续流程
         return chain.filter(exchange);
     }
    }
    
    其中,访问次数使用 Redis 来存储。

    3.3 开启 IP 黑名单

    IP 黑名单可以在网管层面通过代码实现,也可以通过短信提供商提供的 IP 黑名单来实现。

例如,阿里云短信提供的 IP 黑名单机制,如下图所示:
image.png
image.png
通过以上设置之后,我们就可以将监控中有问题的 IP 设置为黑名单,此时 IP 黑名单中的 IP 就不能调用短信的发送功能了。

PS:网关层面实现 IP 黑名单,可以参考添加 IP 限制的代码进行改造。

3.4 限制验证码的发送频次

验证码的发送频次,可以通过网关或短信提供商来解决。以阿里云短信为例,它可以针对每个手机号设置每分钟、每小时、每天的短信最大发送数,如下图所示:
image.png
当然,这个值也可以人为修改,但阿里云短信每天单个手机号最多支持发送 40 条短信。

3.5 开启短信提供商的防控和报警功能

短信提供商通常会提供防盗、防刷的机制。例如,阿里短信它可以设置短信发送总量阈值报警、套餐余量提醒、每日/每月发送短信数量限制等功能,如下图所示:
image.png

课后思考

本文所描述的问题只是日常开发中遇到的问题之一,但是除了本文提供的问题之外,你还遇到了哪些记忆深刻的问题呢?你又是如何解决的呢?欢迎评论区留言互动,最佳留言者,将会获得一次免费的简历辅导服务,欢迎大家积极参与并讨论。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关文章
|
数据采集 监控 安全
阿里云短信服务+图形认证,有效降低验证码盗刷概率
阿里云短信服务+图形认证服务,有效降低验证码盗刷概率。
1482 3
阿里云短信服务+图形认证,有效降低验证码盗刷概率
|
Ubuntu 开发工具
Ubuntu更换阿里云软件源
Ubuntu更换阿里云软件源
146547 0
|
人工智能 自然语言处理 Java
为什么越来越多企业用阿里云发短信?稳定、合规、高到达率的背后
短信仍是企业触达用户的“最后一公里”,阿里云短信服务凭借合规报备、99%高到达率、失败不计费及透明计价等优势,成为电商、物流、政务等行业首选。开发友好,10分钟快速接入,助力企业稳定高效通信。
436 0
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
14824 60
|
4月前
|
安全 Cloud Native 数据中心
Windows Server 2019 中文版、英文版下载 (2025 年 12 月更新)
Windows Server 2019 x64 Version 1809 (updated Dec 2025)
658 0
Windows Server 2019 中文版、英文版下载 (2025 年 12 月更新)
|
11月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
13746 33
MCP客户端调用看这一篇就够了(Java版)
|
10月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
8844 1
|
监控 安全 数据安全/隐私保护
如何有效防止验证码盗刷?
验证码盗刷是攻击者利用程序批量请求短信验证码,对用户和企业造成经济损失与骚扰的安全威胁。为更安全地完成身份验证,企业可以采用阿里云提供的防盗刷监控、号码认证及图形认证等服务。
1331 11
|
算法 NoSQL 关系型数据库
九种分布式ID解决方案
在复杂的分布式系统中,往往需要对大量的数据进行唯一标识,比如在对一个订单表进行了分库分表操作,这时候数据库的自增ID显然不能作为某个订单的唯一标识。除此之外还有其他分布式场景对分布式ID的一些要求:
1554 0
|
Docker 容器
docker设置国内镜像源
docker设置国内镜像源
46694 5