亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java防止短信盜刷和轟炸的解決方案

 更新時間:2024年02月06日 08:51:37   作者:Java中文社群  
短信盜刷和短信轟炸是項目開發(fā)中必須要解決的問題之一,它的優(yōu)先級不亞于 SQL 注入的問題,今天我們就來看下,如何防止這個問題,需要的朋友可以參考下

1.概念介紹

短信盜刷和短信轟炸的概念如下:

  • 短信盜刷是指使用某種技術(shù)手段,偽造大量手機號調(diào)用業(yè)務系統(tǒng),盜取并發(fā)送大量短信的問題。這樣會導致短信系統(tǒng)欠費,不能正常發(fā)送短信,同時也給業(yè)務系統(tǒng)方,帶來了一定的經(jīng)濟損失和不必要的麻煩。
  • 短信轟炸是指攻擊者利用某種技術(shù)手段,連續(xù)、大量地向目標手機號碼發(fā)送短信,以達到騷擾、干擾或消耗目標用戶的時間、流量與精力的目的。這種行為可能會對受害者造成騷擾、通信中斷和手機電量消耗過快等問題。

2.解決方案

短信盜刷和短信轟炸屬于一類問題,可以一起解決。但這類問題的解決,不能依靠某一種解決方案,而是多種解決方案共同作用,來預防此類問題的發(fā)生。

這類問題的綜合解決方案有以下幾個:

  • 添加圖形驗證碼:用戶發(fā)送短信前,需要先輸入正確的圖形驗證碼,或拖動驗證碼等驗證,驗證通過之后,才能正常發(fā)送短信驗證碼。因為圖形驗證碼的破解難度非常大,所以就避免了自動發(fā)送短信程序的執(zhí)行。
  • 添加 IP 限制:對請求 IP 的發(fā)送次數(shù)進行限制,避免短信盜刷和短信轟炸的問題。例如,每個 IP 每天只能發(fā)送 10 條短信。
  • 開啟 IP 黑名單:限制某個 IP 短信發(fā)送功能,從而禁止自動發(fā)送短信程序的執(zhí)行。
  • 限制發(fā)送頻次:一個手機號不能一直不停的發(fā)送驗證碼(即使更換了多個 IP 也不行),設置一個手機號,每分鐘內(nèi)只能發(fā)送 1 次驗證碼;一小時之內(nèi),只能發(fā)送 5 次驗證碼;一天之內(nèi),只能發(fā)送 10 次驗證碼。
  • 開啟短信提供商的防控和報警功能:幾乎所有的短信提供商都提供了,異常短信的防控和提醒功能,開啟這些保護措施,可以盡可能的避免短信盜刷的問題。

具體實現(xiàn)如下。

3.具體解決方案

3.1 添加圖形驗證碼

圖形驗證碼的執(zhí)行流程如下:

  • 當用戶點擊“發(fā)送短信驗證碼”的時候,前端程序請求后端生成圖形驗證碼,后端程序生成圖形驗證碼的功能,可以借助 Hutool 框架來生成,它的核心實現(xiàn)代碼如下:
@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);
}

上述執(zhí)行代碼中有兩個關鍵操作:第一,生成圖形驗證碼,并返回給前端程序;第二,將此圖形驗證的標識(ID)和正確的驗證碼保存到 Redis,方便后續(xù)驗證。

  • 前端用戶拿到圖形驗證碼之后,輸入圖形驗證碼,請求后端程序驗證,并發(fā)送短信驗證碼。
  • 后端程序拿到(圖形)驗證碼之后,先驗證(圖形)驗證碼的正確性.如果正確,則發(fā)送短信驗證碼,否則,將不執(zhí)行后續(xù)流程并返回執(zhí)行失敗給前端,核心實現(xiàn)代碼如下:
// 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 發(fā)送短信業(yè)務......

3.2 添加 IP 限制

IP 限制可以在網(wǎng)關層 Spring Cloud Gateway 中實現(xiàn),在 Gateway 中使用全局過濾器來完成 IP 限制,核心實現(xiàn)代碼如下:

@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){ // 大于最大執(zhí)行次數(shù)
            redisTemplate.opsForValue().decrement(ip, 1); // 變回原來的值
            // 終止執(zhí)行
            response.setStatusCode(HttpStatus.METHOD_NOT_ALLOWED);
            return response.setComplete();
        }
        redisTemplate.expire(ip, 1, TimeUnit.DAYS); // 設置過期時間
        // 執(zhí)行成功,繼續(xù)執(zhí)行后續(xù)流程
        return chain.filter(exchange);
    }
}

其中,訪問次數(shù)使用 Redis 來存儲。

3.3 開啟 IP 黑名單

IP 黑名單可以在網(wǎng)管層面通過代碼實現(xiàn),也可以通過短信提供商提供的 IP 黑名單來實現(xiàn)。

例如,阿里云短信提供的 IP 黑名單機制,如下圖所示:

通過以上設置之后,我們就可以將監(jiān)控中有問題的 IP 設置為黑名單,此時 IP 黑名單中的 IP 就不能調(diào)用短信的發(fā)送功能了。

PS:網(wǎng)關層面實現(xiàn) IP 黑名單,可以參考添加 IP 限制的代碼進行改造。

3.4 限制驗證碼的發(fā)送頻次

驗證碼的發(fā)送頻次,可以通過網(wǎng)關或短信提供商來解決。以阿里云短信為例,它可以針對每個手機號設置每分鐘、每小時、每天的短信最大發(fā)送數(shù),如下圖所示:

當然,這個值也可以人為修改,但阿里云短信每天單個手機號最多支持發(fā)送 40 條短信。

3.5 開啟短信提供商的防控和報警功能

短信提供商通常會提供防盜、防刷的機制。例如,阿里短信它可以設置短信發(fā)送總量閾值報警、套餐余量提醒、每日/每月發(fā)送短信數(shù)量限制等功能,如下圖所示:

最后

以上就是Java防止短信盜刷和轟炸的解決方案的詳細內(nèi)容,更多關于Java防止短信盜刷和轟炸的資料請關注腳本之家其它相關文章!

相關文章

  • java多線程關鍵字final和static詳解

    java多線程關鍵字final和static詳解

    這篇文章主要介紹了java多線程關鍵字final和static詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java中對象與C++中對象的放置安排的對比

    Java中對象與C++中對象的放置安排的對比

    這篇文章主要介紹了Java中對象與C++中對象的放置安排的對比的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Scala中Array和List的區(qū)別說明

    Scala中Array和List的區(qū)別說明

    這篇文章主要介紹了Scala中Array和List的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springboot+vue實現(xiàn)七牛云頭像的上傳

    springboot+vue實現(xiàn)七牛云頭像的上傳

    本文將介紹如何在Spring Boot項目中利用七牛云進行圖片上傳并將圖片存儲在云存儲中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • 詳解maven安裝教程以及解決安裝不成功的解決辦法

    詳解maven安裝教程以及解決安裝不成功的解決辦法

    這篇文章主要介紹了詳解maven安裝教程以及解決安裝不成功的解決辦法,詳細的介紹了幾種解決方法,非常具有實用價值,需要的朋友可以參考下
    2018-12-12
  • 實例詳解Java中如何對方法進行調(diào)用

    實例詳解Java中如何對方法進行調(diào)用

    這篇文章主要介紹了實例詳解Java中如何對方法進行調(diào)用,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • 在java程序中使用protobuf

    在java程序中使用protobuf

    這篇文章主要介紹了protobuf的基本使用和同java結(jié)合的具體案例,感性興趣的小伙伴可以一起來閱讀下文
    2021-08-08
  • Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回

    Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回

    這篇文章主要介紹了Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 項目連接nacos配置中心報錯:Client not connected, current status:STARTING的解決方案

    項目連接nacos配置中心報錯:Client not connected, current

    這篇文章主要介紹了項目連接nacos配置中心報錯:Client not connected, current status:STARTING的解決方案,采用了mysql作為持久化的數(shù)據(jù)庫,docker作為運行的環(huán)境,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • SpringBoot中的配置類(@Configuration)

    SpringBoot中的配置類(@Configuration)

    這篇文章主要介紹了SpringBoot中的配置類(@Configuration),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論