防止接口被薅羊毛(防刷)(DAY 002)

背景:短信驗證碼接口被不法分子用來做灰產(短信郵箱轟炸機)

如何避免??的?站成為”?雞“或者被刷?

  • 增加圖形驗證碼(開發?員)
  • 單IP請求次數限制(開發?員)

防刷之圖形驗證碼(?歌kaptcha)

<dependency><groupId>com.baomidou</groupId><artifactId>kaptcha-spring-boot-starter</artifactId>
</dependency>

配置

package com.huoranger.dlink.config;import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Properties;/*** @author huoranger* @since 2025-09-05*/
@Configuration
public class CaptchaConfig {/*** 驗證碼配置* Kaptcha配置類名** @return*/@Bean@Qualifier("captchaProducer")public DefaultKaptcha kaptcha() {DefaultKaptcha kaptcha = new DefaultKaptcha();Properties properties = new Properties();
//    properties.setProperty(Constants.KAPTCHA_BORDER, "yes");
//    properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "220,220,220");
//    //properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "38,29,12");
//    properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "147");
//    properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "34");
//    properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "25");
//    //properties.setProperty(Constants.KAPTCHA_SESSION_KEY, "code");//驗證碼個數properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
//    properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Courier");//字體間隔properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE,"8");//干擾線顏色
//    properties.setProperty(Constants.KAPTCHA_NOISE_COLOR, "white");//干擾實現類properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");//圖片樣式properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WaterRipple");//文字來源properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789");Config config = new Config(properties);kaptcha.setConfig(config);return kaptcha;}
}

接口,使用瀏覽器指紋作為redis 的key,與客戶端進行綁定:

    /*** 生成驗證碼*/@GetMapping("captcha")public void getCaptcha(HttpServletRequest request, HttpServletResponse response){String captchaText = producer.createText();log.info("驗證碼內容:{}",captchaText);// 存儲Redis,配置過期時間redisTemplate.opsForValue().set(getCaptchaKey(request), captchaText, CAPTCHA_CODE_EXPIRED, TimeUnit.MILLISECONDS);BufferedImage image = producer.createImage(captchaText);try (ServletOutputStream outputStream = response.getOutputStream();){ImageIO.write(image,"jpg", outputStream);outputStream.flush();} catch (IOException e) {log.info("獲取流出錯:{}",e.getMessage());}}/*** 發送短信驗證碼* @return*/@PostMapping("/send_code")public ResponseData sendCode(@RequestBody SendCodeRequest sendCodeRequest, HttpServletRequest request){String key = getCaptchaKey(request);String cacheCaptcha = redisTemplate.opsForValue().get(key);String captcha = sendCodeRequest.getCaptcha();if (cacheCaptcha != null && cacheCaptcha.equalsIgnoreCase(captcha)){//成功redisTemplate.delete(key);return notifyService.sendCode(SendCodeEnum.USER_REGISTER,sendCodeRequest.getTo());}else {return ResponseData.buildResult(BizCodeEnum.CODE_ERROR);}}private String getCaptchaKey(HttpServletRequest request){String ip = CommonUtil.getIpAddr(request);String userAgent = request.getHeader("User-Agent");String key = "account-service:captcha:" + CommonUtil.MD5(ip + userAgent);log.info("驗證碼key:{}", key);return key;}

防刷之禁止重復發送短信

  • 60秒后才可以?新發送短信驗證碼
  • 發送的短信驗證碼10分鐘內有效

方案:
?式?:前端增加校驗倒計時,不到60秒按鈕不給點擊

  • 簡單
  • 不安全,存在繞過的情況

?式?:增加Redis存儲,發送的時候設置下額外的key,并且60秒后過期

  • ?原?操作,存在不?致性
  • 增加的額外的key - value存儲,浪費空間

?式三:基于原先的key拼裝時間戳

  • 好處:滿?了當前節點內的原?性,也滿?業務需求
 @Overridepublic ResponseData sendCode(SendCodeEnum sendCodeEnum, String to) {String cacheKey = String.format(RedisKey.CHECK_CODE_KEY,sendCodeEnum.name(),to);String cacheValue = redisTemplate.opsForValue().get(cacheKey);//如果不為空,再判斷是否是60秒內重復發送 0122_232131321314132if (StringUtils.isNotBlank(cacheValue)){long ttl = Long.parseLong(cacheValue.split("_")[1]);//當前時間戳-驗證碼發送的時間戳,如果小于60秒,則不給重復發送long leftTime = CommonUtil.getCurrentTimestamp() - ttl;if (leftTime < (60 * 1000)){log.info("重復發送短信驗證碼,時間間隔:{}秒",leftTime);return ResponseData.buildResult(BizCodeEnum.CODE_LIMITED);}}String code = CommonUtil.getRandomCode(6);//生成拼接好驗證碼String value = code + CommonUtil.getCurrentTimestamp();redisTemplate.opsForValue().set(cacheKey, value, CODE_EXPIRED, TimeUnit.MILLISECONDS);if (CheckUtil.isEmail(to)){//發送郵箱驗證碼  TODO}else if (CheckUtil.isPhone(to)){//發送手機驗證碼smsComponent.send(to, smsConfig.getTemplateId(),code);}return ResponseData.buildSuccess();}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98374.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【RabbitMQ】----RabbitMQ 的7種工作模式

1.Simple(簡單模式) P:?產者,也就是要發送消息的程序 C:消費者,消息的接收者 Queue:消息隊列,圖中??背景部分.類似?個郵箱,可以緩存消息;?產者向其中投遞消息,消費者從其中取出消息. 特點:?個?產者P&#xff0c;?個消費者C,消息只能被消費?次.也稱為點對點(Point-to-P…

今日分享:C++ -- list 容器

&#x1f60e;【博客主頁&#xff1a;你最愛的小傻瓜】&#x1f60e; &#x1f914;【本文內容&#xff1a;C list容器 &#x1f60d;】&#x1f914; --------------------------------------------------------------------------------------------------------------------…

【Python】數據可視化之分布圖

分布圖主要用來展示某些現象或數據在地理空間、時間或其他維度上的分布情況。它可以清晰地反映出數據的空間位置、數量、密度等特征&#xff0c;幫助人們更好地理解數據的內在規律和相互關系。 目錄 單變量分布 變量關系組圖 雙變量關系 核密度估計 山脊分布圖 單變量分布…

DDD+WebAPI實戰

DDD+WebAPI實戰 DDD(領域驅動設計,Domain-Driven Design)是一種面向對象的設計方法,它強調將業務邏輯封裝在模型中,并通過這些模型來驅動整個應用的設計。在.NET環境中,特別是在使用ASP.NET Core和Web API構建應用時,DDD可以幫助我們更好地組織代碼,使得業務邏輯更加清…

人力資源管理的思維方法學習筆記1

北京師范大學政府管理學院1.課程介紹&#xff1a; 講述視角上&#xff0c;本課程側重人力資源管理的思維方式&#xff0c;即人力資源管理理論和時間的不同視角和主導范式的分析。這既是對人力資源管理理論發展的凝練&#xff0c;也是對人力資源管理實踐演進過程的總結。對于把握…

適應新環境:Trae編輯器下的IDEA快捷鍵定制

介紹&#xff1a;學習如何在Trae編輯器中配置IntelliJ IDEA風格的快捷鍵&#xff0c;減少開發環境間的切換成本&#xff0c;提升編碼效率。通過安裝插件或手動調整&#xff0c;讓你更快適應新工具大家好&#xff0c;我是凱哥Java本文標簽&#xff1a;代碼編輯效率、Trae快捷鍵、…

基于YOLO8的汽車碰撞事故檢測系統【數據集+源碼+文章】

基于YOLOv8和Streamlit的汽車碰撞事故檢測系統 文末附下載地址 開發目的 隨著城市化進程的加快和機動車保有量的持續攀升&#xff0c;道路交通安全問題日益突出&#xff0c;汽車碰撞事故頻發不僅嚴重威脅駕乘人員的生命安全&#xff0c;也對公共秩序、應急響應效率及交通管理…

Unity FARO 測量臂:從零構建實時數字孿生系統

前言:當精準測量遇見實時渲染 在高端制造、質量檢測和逆向工程領域,法奧 (FARO) 測量臂是精準的代名詞。它能以亞毫米級的精度捕捉現實世界中的三維坐標。現在,想象一下,如果我們將這種精度與 Unity 的強大實時渲染能力結合起來,會發生什么? 我們將得到一個數字孿生 (D…

延遲 隊列

概念 延遲隊列顧名思義就是消息不立即發送給消費者消費&#xff0c;而是延遲一段時間再交給消費者。 RabbitMQ本身沒有直接支持延遲隊列的的功能&#xff0c;但是可以通過前面所介紹的TTL死信隊列的方式組合 模擬出延遲隊列的功能. RabbitMQ 有些版本還支持延遲隊列的插件安…

Windows+Docker一鍵部署CozeStudio私有化,保姆級

在 ?Windows環境? 下&#xff0c;通過docker&#xff0c;使用 ?火山引擎Doubao-Seed-1.6模型&#xff0c;面向 ?小白新手? 的 ?Coze Studio私有化部署詳細步驟。整個過程分為四大階段&#xff0c;包含每一步的指令、成功標志。 Coze Studio 私有化部署指南&#xff08;W…

【HEMCO Reference Guide 參考指南第二期】配置文件的結構和語法

配置文件的結構和語法 HEMCO 配置文件的結構和語法(The HEMCO configuration file) 1. Settings(設置) 2. Extension Switches(擴展模塊開關) 3. Base Emissions(基礎排放配置) 4. Scale Factors(縮放因子) 5. Masks(掩膜區域) 6. Data Collections(數據集合) 參…

01.單例模式基類模塊

一、單例模式的構成1、私有的靜態成員變量2、公共的靜態成員屬性或方法3、私有構造函數using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager : MonoBehaviour {void Start(){}// Update is called once per framevoid Up…

[網絡入侵AI檢測] 深度前饋神經網絡(DNN)模型

第4章&#xff1a;深度前饋神經網絡&#xff08;DNN&#xff09;模型 歡迎回來&#x1f43b;??? 在第1章&#xff1a;分類任務配置&#xff08;二分類 vs. 多分類&#xff09;中&#xff0c;我們學習了如何配置模型以回答不同類型的問題&#xff1b;在第2章&#xff1a;數…

【目錄-多選】鴻蒙HarmonyOS開發者基礎

All look at the answer 針對包含文本元素的組件&#xff0c;例如Text、Button、TextInput等&#xff0c;可以使用下列哪些屬性關于ForEach(arr, itemGenerator, index)組件的描述正確的是下面哪些容器組件是可以滾動的關于Tabs組件和TabContent組件&#xff0c;下列描述正確的…

第一講 Vscode+Python+anaconda 安裝

1、vscode下載和安裝官網下載最新版&#xff1a;https://code.visualstudio.com/Download注&#xff1a;文件夾最好不要出現中文和空格 2、將vscode修改為中文環境注意&#xff1a;右下角彈出提示框&#xff0c;點擊“yes”若不慎關閉了對話框&#xff0c;也不要緊&#xff0c;…

《sklearn機器學習——回歸指標2》

均方對數誤差&#xff08;mean_squared_log_error函數&#xff09; mean_squared_log_error函數計算與平方&#xff08;二次方&#xff09;對數誤差或損失的期望值相一致的風險指標。 Mean Squared Logarithmic Error 參數與返回值 函數簡介 mean_squared_log_error 是用于計算…

當電力設計遇上AI:良策金寶AI如何重構行業效率邊界?

在工程設計行業&#xff0c;我們常說“經驗為王”。一個資深工程師的價值&#xff0c;往往體現在他對規范的熟悉、對計算的把握、對圖紙的掌控。但今天&#xff0c;這個“王座”正在被重新定義。不是經驗不重要了&#xff0c;而是——效率的邊界&#xff0c;正在被AI重構。以良…

【深度學習】重采樣(Resampling)

在深度學習的背景下&#xff0c;重采樣主要涉及兩個方面&#xff1a; 數據層面的重采樣&#xff1a;處理不平衡數據集。模型層面的重采樣&#xff1a;在神經網絡內部進行上采樣&#xff08;UpSampling&#xff09;或下采樣&#xff08;DownSampling&#xff09;&#xff0c;常見…

計算機實現乘法運算的方式---ChatGPT 5 thinking作答

計算機如何實現“乘法” 下面分層次把乘法在數據表示 → 整數硬件/軟件 → 大整數 → 浮點數 → 特殊場景里的主流實現方式講清楚&#xff0c;并給出取舍建議與簡單偽代碼。0&#xff09;前置&#xff1a;數的表示 無符號整數&#xff1a;按二進制位權求值。有符號整數&#xf…

Ubuntu 安裝 / 配置 VNC

一、基礎環境準備 1. 更新 sudo apt update 2. 安裝 VNC 服務器 & 輕量桌面(XFCE) # 安裝 TightVNC 服務器 + XFCE 桌面(推薦輕量方案) sudo apt install tightvncserver xfce4 xfce4-goodies xterm -y二、核心配置:讓 VNC 加載桌面環境 1. 初始化 VNC 密碼(首次…