JeecgBoot 短信验证码接口,如何实现防刷机制?

简介: 短信接口防刷,主要通过两个方面来实现:一个是短信接口加签和时间戳;另外针对短信接口,增加防刷 check 机制

短信接口防刷,主要通过两个方面来实现:一个是短信接口加签和时间戳;另外针对短信接口,增加防刷 check 机制;

具体如下:

一、针对短信接口加签和时间戳

加签配置很简单,直接将需要控制的接口加到 yml 的参数 jeecg.signUrls 中即可。

目前涉及接口:

/sys/sms
/sys/sendChangePwdSms

二、短信接口增加高频校验

同一个 IP 一分钟发送超过 5 次短信,则获取短信接口提示需要验证码

防止刷短信 check 具体逻辑:

  • 同一 IP,一分钟内发短信不允许超过 5 次(每一分钟重置每个 IP 请求次数)
  • 同一 IP,一分钟内发短信超过 20 次,进入黑名单,不让使用短信接口
2.1 在发送短信的地方,增加高频 check

2.2 获取短信的验证码接口

2.3 防止刷短信工具类实现如下
package org.jeecg.common.util;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 防止刷短信工具
 * 
 * 1、同一IP,1分钟内发短信不允许超过5次(每一分钟重置每个IP请求次数)
 * 2、同一IP,1分钟内发短信超过20次,进入黑名单,不让使用短信接口
 */
@Slf4j
public class DySmsLimit {
    // 1分钟内最大发短信数量(单一IP)
    private static final int MAX_MESSAGE_PER_MINUTE = 5;
    // 1分钟
    private static final int MILLIS_PER_MINUTE = 60000;
    // 一分钟内报警线最大短信数量,超了进黑名单(单一IP)
    private static final int MAX_TOTAL_MESSAGE_PER_MINUTE = 20;
    private static ConcurrentHashMap<String, Long> ipLastRequestTime = new ConcurrentHashMap<>();
    private static ConcurrentHashMap<String, Integer> ipRequestCount = new ConcurrentHashMap<>();
    private static ConcurrentHashMap<String, Boolean> ipBlacklist = new ConcurrentHashMap<>();
    /**
     * @param ip 请求发短信的IP地址
     * @return
     */
    public static boolean canSendSms(String ip) {
        long currentTime = System.currentTimeMillis();
        long lastRequestTime = ipLastRequestTime.getOrDefault(ip, 0L);
        int requestCount = ipRequestCount.getOrDefault(ip, 0);
        log.info("IP:{}, Msg requestCount:{} ", ip, requestCount);
        if (ipBlacklist.getOrDefault(ip, false)) {
            // 如果IP在黑名单中,则禁止发送短信
            log.error("IP:{}, 进入黑名单,禁止发送请求短信!", ip);
            return false;
        }
        if (currentTime - lastRequestTime >= MILLIS_PER_MINUTE) {
            // 如果距离上次请求已经超过一分钟,则重置计数
            ipRequestCount.put(ip, 1);
            ipLastRequestTime.put(ip, currentTime);
            return true;
        } else {
            // 如果距离上次请求不到一分钟
            ipRequestCount.put(ip, requestCount + 1);
            if (requestCount < MAX_MESSAGE_PER_MINUTE) {
                // 如果请求次数小于5次,允许发送短信
                return true;
            } else if (requestCount >= MAX_TOTAL_MESSAGE_PER_MINUTE) {
                // 如果请求次数超过报警线短信数量,将IP加入黑名单
                ipBlacklist.put(ip, true);
                return false;
            } else {
                log.error("IP:{}, 1分钟内请求短信超过5次,请稍后重试!", ip);
                return false;
            }
        }
    }
    /**
     * 图片二维码验证成功之后清空数量
     * 
     * @param ip IP地址
     */
    public static void clearSendSmsCount(String ip) {
        long currentTime = System.currentTimeMillis();
        ipRequestCount.put(ip, 0);
        ipLastRequestTime.put(ip, currentTime);
    }
}
目录
相关文章
|
12月前
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
1346 3
|
8月前
|
机器学习/深度学习 人工智能 API
AI 项目开发:零基础快速使用 Python 调用大模型 LLM API
在 AI 重塑行业的今天,掌握 大模型(LLM)开发技能是核心竞争力。本文作为快速 Python AI 教程,将带你从零开始,用 Python 代码完成对全球主流 AI 大模型(GPT-4o/Claude)的 API 调用。我们将快速让你了解 LLM API 原理,助你低成本快速构建 AI 系统。
2171 0
|
11月前
|
数据采集 监控 API
淘宝商品信息批量获取接口技术详解
本文介绍批量获取淘宝商品信息的两种方法:官方API与Python爬虫。涵盖应用场景、技术实现、代码示例及合规注意事项,助您高效采集标题、价格、销量等数据,用于市场分析与竞品监控,兼顾可行性与风险控制。(238字)
3204 0
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
733 1
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
1635 3
|
缓存 算法 NoSQL
短信验证码登录接口,如何防止恶意攻击
该文讨论了移动应用中常见的手机短信验证码登录方式,后端实现通常涉及两个API:获取短信验证码和短信验证码登录。在设计时,为增强短信验证码接口的安全性,提出了几种无需使用Redis等存储介质的方案:1) 使用数字签名,基于时间戳或随机数生成唯一签名进行验证;2) 基于时间的有效期验证,通过加密或修改时间戳形式确保安全性;3) 应用TOTP算法,按时间生成动态码进行比对;4) 利用JWTToken生成带有限期的签名进行验证。这些方法旨在防止恶意攻击并优化登录接口性能。
1370 1
|
存储 人工智能 数据库
视图是什么?为什么要用视图呢?数据库视图:定义、特点与应用
本文三桥君深入探讨数据库视图的概念与应用,从定义特点到实际价值全面解析。视图作为虚拟表具备动态更新、简化查询、数据安全等优势,能实现多角度数据展示并保持数据库重构的灵活性。产品专家三桥君还分析了视图与基表关系、创建维护要点及性能影响,强调视图是提升数据库管理效率的重要工具。三桥君通过系统讲解,帮助读者掌握这一常被忽视却功能强大的数据库特性。
2787 0
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
Go 开发者
LightFlow:一个基于函数式编程的任务编排框架
**LightFlow** 是一个基于 Go 语言的任务编排框架,简化复杂任务流的设计与管理。它通过函数式编程让开发者直接在代码中定义任务流,无需繁琐配置。选择 LightFlow 可简化任务流管理,专注于执行时机,提升维护性和可扩展性。核心特性包括隔离性上下文、基于执行时机的编排、流程合并、智能资源管理、断点恢复等。安装简单,提供丰富的文档支持,帮助快速上手并高效管理任务流。
584 4