最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.概念介紹

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

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

2.解決方案

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

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

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

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

3.具體解決方案

3.1 添加圖形驗(yàn)證碼

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

  • 當(dāng)用戶點(diǎn)擊“發(fā)送短信驗(yàn)證碼”的時(shí)候,前端程序請(qǐng)求后端生成圖形驗(yàn)證碼,后端程序生成圖形驗(yàn)證碼的功能,可以借助 Hutool 框架來生成,它的核心實(shí)現(xiàn)代碼如下:
@RequestMapping("/getcaptcha")
public AjaxResult getCaptcha(){
    // 1.生成驗(yàn)證碼到本地
    // 定義圖形驗(yàn)證碼的長(zhǎng)和寬
    LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(128, 50);
    String uuid = UUID.randomUUID().toString().replace("-","");
    // 圖形驗(yàn)證碼寫出,可以寫出到文件,也可以寫出到流
    lineCaptcha.write(imagepath+uuid+".png");
    // url 地址
    String url = "/image/"+uuid+".png";
    // 將驗(yàn)證碼存儲(chǔ)到 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í)行代碼中有兩個(gè)關(guān)鍵操作:第一,生成圖形驗(yàn)證碼,并返回給前端程序;第二,將此圖形驗(yàn)證的標(biāo)識(shí)(ID)和正確的驗(yàn)證碼保存到 Redis,方便后續(xù)驗(yàn)證。

  • 前端用戶拿到圖形驗(yàn)證碼之后,輸入圖形驗(yàn)證碼,請(qǐng)求后端程序驗(yàn)證,并發(fā)送短信驗(yàn)證碼。
  • 后端程序拿到(圖形)驗(yàn)證碼之后,先驗(yàn)證(圖形)驗(yàn)證碼的正確性.如果正確,則發(fā)送短信驗(yàn)證碼,否則,將不執(zhí)行后續(xù)流程并返回執(zhí)行失敗給前端,核心實(shí)現(xiàn)代碼如下:
// redis 里面 key 對(duì)應(yīng)的真實(shí)的驗(yàn)證碼
String redisCodeValue = (String) redisTemplate.opsForValue().get(user.getCodeKey());
// 驗(yàn)證 redis 中的驗(yàn)證碼和用戶輸入的驗(yàn)證碼是否一致
if (!StringUtils.hasLength(redisCodeValue) || !redisCodeValue.equals(user.getCheckCode())) {
    // 驗(yàn)證碼不正確
    return AjaxResult.fail(-1, "驗(yàn)證碼錯(cuò)誤");
}
// 清除 redis 中的驗(yàn)證碼
redisTemplate.opsForValue().set(userInfoVO.getCodeKey(), "");
// 請(qǐng)求短信 API 發(fā)送短信業(yè)務(wù)......

3.2 添加 IP 限制

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

@Component
public class IpFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 獲取請(qǐng)求 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); // 設(shè)置過期時(shí)間
        // 執(zhí)行成功,繼續(xù)執(zhí)行后續(xù)流程
        return chain.filter(exchange);
    }
}

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

3.3 開啟 IP 黑名單

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

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

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

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

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

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

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

3.5 開啟短信提供商的防控和報(bào)警功能

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

最后

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

相關(guān)文章

  • Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解

    Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Spring.Net IOC依賴注入原理流程解析

    Spring.Net IOC依賴注入原理流程解析

    這篇文章主要介紹了Spring.Net IOC依賴注入原理流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python安裝Jupyter Notebook配置使用教程詳解

    Python安裝Jupyter Notebook配置使用教程詳解

    這篇文章主要介紹了Python安裝Jupyter Notebook配置使用教程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot向resources下寫文件的兩種方式

    SpringBoot向resources下寫文件的兩種方式

    這篇文章給大家分享了兩種SpringBoot向resources下寫文件的方式,每種方式都有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • 使用IDEA進(jìn)行安卓開發(fā)的詳細(xì)圖文教程

    使用IDEA進(jìn)行安卓開發(fā)的詳細(xì)圖文教程

    安卓開發(fā)本身就是Java開發(fā)的一個(gè)分支,我們要確保計(jì)算機(jī)已經(jīng)安裝好JDK并做好了相關(guān)的配置,下面這篇文章主要給大家介紹了關(guān)于如何使用IDEA進(jìn)行安卓開發(fā)的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-04-04
  • Spring事務(wù)框架之TransactionStatus源碼解析

    Spring事務(wù)框架之TransactionStatus源碼解析

    這篇文章主要為大家介紹了Spring事務(wù)框架之TransactionStatus源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Linux中配置Java環(huán)境變量實(shí)現(xiàn)過程

    Linux中配置Java環(huán)境變量實(shí)現(xiàn)過程

    文章介紹了在Linux系統(tǒng)上安裝Java 1.8的步驟:下載、傳輸、解壓至/opt目錄,配置環(huán)境變量(當(dāng)前用戶或全局),使用update-alternatives設(shè)置默認(rèn)版本,并通過命令驗(yàn)證安裝是否成功
    2025-07-07
  • JavaWeb監(jiān)聽器Listener實(shí)例解析

    JavaWeb監(jiān)聽器Listener實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了JavaWeb監(jiān)聽器Listener實(shí)例,針對(duì)監(jiān)聽器進(jìn)行進(jìn)行細(xì)致分析,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JavaTCP上傳圖片代碼實(shí)例

    JavaTCP上傳圖片代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于JavaTCP上傳圖片代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • java打印指定年月的日歷

    java打印指定年月的日歷

    這篇文章主要為大家詳細(xì)介紹了Java如何打印指定年月的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評(píng)論

平乐县| 五寨县| 奈曼旗| 屏东市| 高台县| 平陆县| 廉江市| 保靖县| 卓资县| 河曲县| 苏州市| 松潘县| 始兴县| 涿鹿县| 堆龙德庆县| 泊头市| 吉安县| 无为县| 集安市| 和平县| 开鲁县| 肃宁县| 辽宁省| 永平县| 科尔| 什邡市| 于田县| 青阳县| 象山县| 台山市| 惠州市| 博乐市| 江阴市| 沈阳市| 奉节县| 洛扎县| 余庆县| 井陉县| 富顺县| 微博| 博兴县|