短信盗刷和短信轰炸是项目开发中必须要解决的问题之一,它的优先级不亚于 SQL 注入的问题,同时它也是面试中比较常见的一个经典面试题,今天我们就来看下,如何防止这个问题。
短信盗刷和短信轰炸的概念如下:
短信盗刷和短信轰炸属于一类问题,可以一起解决。但这类问题的解决,不能依靠某一种解决方案,而是多种解决方案共同作用,来预防此类问题的发生。
这类问题的综合解决方案有以下几个:
具体实现如下。
图形验证码的执行流程如下:
当用户点击“发送短信验证码”的时候,前端程序请求后端生成图形验证码,后端程序生成图形验证码的功能,可以借助 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,方便后续验证。
前端用户拿到图形验证码之后,输入图形验证码,请求后端程序验证,并发送短信验证码。
后端程序拿到(图形)验证码之后,先验证(图形)验证码的正确性.如果正确,则发送短信验证码,否则,将不执行后续流程并返回执行失败给前端,核心实现代码如下:
// 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 发送短信业务......
IP 限制可以在网关层 Spring Cloud Gateway 中实现,在 Gateway 中使用全局过滤器来完成 IP 限制,核心实现代码如下:
@Componentpublic 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 来存储。
IP 黑名单可以在网管层面通过代码实现,也可以通过短信提供商提供的 IP 黑名单来实现。
例如,阿里云短信提供的 IP 黑名单机制,如下图所示:
通过以上设置之后,我们就可以将监控中有问题的 IP 设置为黑名单,此时 IP 黑名单中的 IP 就不能调用短信的发送功能了。
PS:网关层面实现 IP 黑名单,可以参考添加 IP 限制的代码进行改造。
验证码的发送频次,可以通过网关或短信提供商来解决。以阿里云短信为例,它可以针对每个手机号设置每分钟、每小时、每天的短信最大发送数,如下图所示:
当然,这个值也可以人为修改,但阿里云短信每天单个手机号最多支持发送 40 条短信。
短信提供商通常会提供防盗、防刷的机制。例如,阿里短信它可以设置短信发送总量阈值报警、套餐余量提醒、每日/每月发送短信数量限制等功能,如下图所示:
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-74675-0.html面试官:如何防止短信盗刷和短信轰炸?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: DartVM GC 深度剖析
下一篇: 关于 Next.js ,你不知道的事情