如何防止接口被刷

目錄

🛡? 一、常見的防刷策略分類

🔧 二、技術實現細節

? 1. 基于 IP 限流

? 2. 給接口加驗證碼

? 3. 使用 Token 限制接口訪問權限

? 4. 給接口加冷卻時間(驗證碼類經典)

? 5. 使用滑動窗口限流算法(更精細)

? 6. 使用 API 網關限流工具

? 7. 行為分析 + 機器學習防刷(高級)

🔒 三、防刷策略組合應用(實戰示例)

驗證碼接口:/send-code

🧪 四、測試建議

🧠 限流目標設定

📦 所需依賴

🧪 測試方式

? 優勢


防止接口被刷(即防止惡意頻繁訪問接口)是構建穩定、安全的后端服務的關鍵環節。接口被刷會帶來以下問題:

  • 服務壓力大 → 崩潰或變慢;

  • 資源被濫用 → 例如驗證碼短信費用增加;

  • 用戶體驗差 → 正常用戶無法訪問服務;

  • 安全隱患 → 存在撞庫攻擊、惡意爬蟲等風險。


🛡? 一、常見的防刷策略分類

類別技術措施舉例說明
身份識別類登錄校驗、API Key、Token、Cookie 等用戶必須登錄才能訪問某些接口
頻率限制類限流、滑動窗口、漏桶/令牌桶算法每個 IP 每分鐘最多訪問5次
行為識別類圖形驗證碼、人機驗證、行為軌跡分析連續請求驗證碼時需要輸入圖形碼
請求來源控制Referer、User-Agent、IP 黑名單拒絕來自非正常來源的請求
設備綁定每個手機號/賬號最多綁定幾個設備防止批量注冊賬號或虛擬機刷接口

🔧 二、技術實現細節

? 1. 基于 IP 限流

對訪問頻率高的 IP 設置訪問上限:

# Redis限流示例:每個IP每分鐘只能訪問10次
ip_key = f"limit:{ip_address}"
count = redis.incr(ip_key)
if count == 1:redis.expire(ip_key, 60)  # 設置1分鐘過期
if count > 10:return "Too many requests", 429

? 適合接口:短信驗證碼、注冊、登錄、敏感操作。


? 2. 給接口加驗證碼

當用戶觸發“頻繁操作”行為時,加一道圖形驗證碼或滑塊驗證。

示例

  • 連續點擊“獲取驗證碼”按鈕超過2次 → 彈出圖形驗證碼

  • 失敗登錄超過5次 → 要滑動驗證

常用方案:

驗證類型說明
圖形驗證碼傳統的“輸入下圖文字”方式
滑動驗證碼騰訊云、極驗驗證碼等
點選圖標“請點選所有的貓” 等人機驗證

? 3. 使用 Token 限制接口訪問權限

很多接口只能在登錄狀態下訪問,或需要傳遞一個有效的 API token。

例子:

GET /api/send-code
Authorization: Bearer eyJhbGciOiJIUzI1...

如果沒有合法 token,直接拒絕訪問,防止匿名惡意請求。


? 4. 給接口加冷卻時間(驗證碼類經典)

比如:

  • 每個手機號每60秒只能發送一次驗證碼;

  • 同一個賬號每天最多發送 5 次驗證碼。

用 Redis 實現:

key = f"cooldown:{phone}"
if redis.get(key):return "Too frequent", 429
redis.setex(key, 60, "1")  # 設置60秒冷卻期

? 5. 使用滑動窗口限流算法(更精細)

不同于 Redis 的簡單計數,這種方式記錄多個時間戳:

時間窗口 = 1分鐘
若過去1分鐘內請求數 > 10,則拒絕

適合用在中大型項目中,Redis 或網關中集成。


? 6. 使用 API 網關限流工具

許多云服務(如 Nginx + Lua、Kong、Envoy、阿里云API網關)都有限流功能。

例子:

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;server {location /api/ {limit_req zone=req_limit burst=10 nodelay;}
}

含義:同一 IP 每秒最多訪問5次,最多可突發10次。


? 7. 行為分析 + 機器學習防刷(高級)

企業常用方式:

  • 結合訪問路徑、時間間隔、鼠標軌跡、設備ID、IP地區等特征;

  • 判斷是否為腳本行為,自動拉入風控系統;

如支付寶、微信等都會對登錄、轉賬等操作做 AI 風控。


🔒 三、防刷策略組合應用(實戰示例)

驗證碼接口:/send-code

類型策略
限速每個手機號每分鐘一次,IP 每小時最多 20 次
身份登錄后才允許請求驗證碼(防刷注冊)
圖形驗證碼多次請求后彈出圖形驗證
閾值每個賬號/手機號每天最多請求 5 次

🧪 四、測試建議

  1. 自己用腳本模擬高頻調用接口,觀察日志和限流是否生效;

  2. 使用 Apache Benchmark (ab) 或 locust 進行壓力測試;

  3. 查看 Redis、網關是否正確記錄并限制請求。

下面是一個使用 Flask + Redis 實現滑動窗口限流的接口示例,可以有效防止惡意刷接口請求,比如“短信驗證碼接口”。


🧠 限流目標設定

規則: 每個 IP 地址在過去 60 秒內最多訪問 5 次 /send-code 接口。


📦 所需依賴

pip install flask redis

?🧱 項目結構

rate_limit_project/
├── app.py        # Flask主程序
└── limiter.py    # 滑動窗口限流模塊

🔧 limiter.py(滑動窗口限流核心邏輯)

# limiter.pyimport time
import redisr = redis.Redis(host='localhost', port=6379, db=0)def is_allowed(ip: str, max_requests=5, window_seconds=60) -> bool:now = int(time.time())key = f"rate_limit:{ip}"# 移除窗口外的時間戳r.zremrangebyscore(key, 0, now - window_seconds)# 當前請求數量current_count = r.zcard(key)if current_count >= max_requests:return False# 添加當前時間戳(score 和 value 都是當前時間)r.zadd(key, {str(now): now})r.expire(key, window_seconds)return True

🚀 app.py(主接口邏輯)

# app.pyfrom flask import Flask, request, jsonify
from limiter import is_allowedapp = Flask(__name__)@app.route('/send-code', methods=['GET'])
def send_code():ip = request.remote_addrif not is_allowed(ip):return jsonify({"code": 429, "msg": "請求太頻繁,請稍后再試"}), 429# 模擬發送短信驗證碼return jsonify({"code": 200, "msg": "驗證碼已發送(假裝的😄)"})if __name__ == '__main__':app.run(debug=True)

🧪 測試方式

連續請求超過 5 次 /send-code

curl http://localhost:5000/send-code

第 6 次起應該會返回:

{"code": 429,"msg": "請求太頻繁,請稍后再試"
}

? 優勢

  • 基于時間戳的滑動窗口比簡單計數更精準;

  • Redis 存儲時間戳,自動過期,性能高;

  • 可輕松擴展:按用戶 ID、IP、Token 等限流。

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

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

相關文章

github 項目遷移到 gitee

1. 查看遠程倉庫地址 git remote -v 2. 修改遠程倉庫地址 確保 origin 指向你的 Gitee 倉庫,如果不是,修改遠程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…

探索大語言模型(LLM):目標、原理、挑戰與解決方案

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言語言模型的目標語言模型的數學表示語言模型面臨的挑戰解決參數量巨大的方法1. 馬爾可夫假設2. 神經網絡語言模型3.自監督學習4. 分布式表示 腦圖總結 前言 在自…

Kubernetes》》k8s》》Namespace

Namespace 概述 Namespace(命名空間) 是 Kubernetes 中用于邏輯隔離集群資源的機制,可將同一集群劃分為多個虛擬環境,適用于多團隊、多項目或多環境(如開發、測試、生產)的場景。 核心作用: 資…

FFUF指南

ffuf 的核心功能: 目錄/文件發現: 通過暴力破解(使用字典)探測目標網站的隱藏目錄或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚舉: 通過模糊測試發現目標…

Qt通過ODBC和QPSQL兩種方式連接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下驗證連接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下類似,ODBC方式則需要配置odbcinst.ini和odbc.ini。 二、代碼 以下為完整代碼,包含兩種方式連接數據庫,并…

為什么浮點數會搞出Infinity和NAN兩種類型?浮點數的底層原理?IEEE 754標準揭秘?

目錄 什么是NAN? 不同編程語言的NaN 為什么浮點數會搞出Infinity和NAN兩種類型? 浮點數 小數點位置浮動的原因 浮點數和整數 浮點數指令 精確性 浮點數的類型 為什么叫浮點數? 小數點位置浮動的原因 IEEE 754起源于intel公司 IEEE 754標準 編程語言的浮點數都…

Node.js Session 原理簡單介紹 + 示例代碼

目錄 ? Session 原理簡要說明 🧩 示例項目 - 使用 Node.js Express 實現簡單 Session 登錄 📁 文件結構 🔹 server.js (JavaScript) 🔸 index.html (HTML) ?? 程序運行步驟 ? 程序運行效果 🎯 總結 在 We…

實戰交易策略 篇十六:獵豹阿杜打板交易策略

文章目錄 系列文章狙擊漲停板的十大要訣炒股大成者,必具“三商”系列文章 實戰交易策略 篇一:奧利弗瓦萊士短線交易策略 實戰交易策略 篇二:杰西利弗莫爾股票大作手操盤術策略 實戰交易策略 篇三:333交易策略 實戰交易策略 篇四:價值投資交易策略 實戰交易策略 篇五:底部…

Opentelemetry 項目解讀

Opentelemetry 解讀 1. 什么是 Opentelmetry Ot 統一了可觀測的三個重要維度:分別是 Trace,Log,Metrics。 在沒有 ot 之前,不同維度的可觀測組件都是不同的: 在 Trace 領域:skywalking 一直很受歡迎&am…

與終端同居日記:Linux指令の進階撩撥手冊

前情提要: 當你和終端的關系從「早安打卡」進階到「深夜代碼同居」,那些曾經高冷的指令開始展露致命の反差萌—— man 是那個永遠在線的鋼鐵直男說明書,只會說:"想懂我?自己看文檔!"&#xff08…

Java 開發玩轉 MCP:從 Claude 自動化到 Spring AI Alibaba 生態整合

摘要 本文以原理與示例結合的形式講解 Java 開發者如何基于 Spring AI Alibaba 框架玩轉 MCP,主要包含以下內容。 1. 一些 MCP 基礎與快速體驗(熟悉的讀者可以跳過此部分) 2. 如何將自己開發的 Spring 應用發布為 MCP Server,驗…

【面試向】欠擬合和過擬合、正則化(Regularization)

訓練集、驗證集和測試集泛化誤差過擬合(Overfitting)和 欠擬合(Underfitting)如何區分過擬合和欠擬合?欠擬合 —— 在訓練集和驗證集上都表現很差過擬合 —— 在訓練集上表現很好,但在驗證集或測試集上表現…

ClawCloud的免費空間(github用戶登錄可以獲得$5元/月的免費額度)

免費的空間 Welcome to ClawCloud Lets create your workspace 官網:ClawCloud | Cloud Infrastructure And Platform for Developers 區域選擇新加坡 然后這個頁面會變成新加坡區域,再按一次確定,就創建好了工作臺。 初始界面&#xff0…

Spring Boot + Caffeine:打造高性能緩存解決方案

1. 引言 1.1 緩存的重要性 緩存是提升系統性能的關鍵技術之一,通過將頻繁訪問的數據存儲在內存中,減少對數據庫或其他外部系統的訪問次數,從而降低延遲并提高吞吐量。 緩存的基本概念:緩存是一種臨時存儲機制,用于快速訪問常用數據。緩存在提升系統性能中的作用:減少數…

每天學一個 Linux 命令(24):chattr

??可訪問網站查看,視覺品味拉滿: http://www.616vip.cn/24/index.html 每天學一個 Linux 命令(24):chattr 命令簡介 chattr(Change Attribute)用于修改文件或目錄的底層屬性(如防刪除、防修改),這些屬性比普通權限更嚴格。常用于保護重要文件或優化文件系統行為。…

【java 13天進階Day04】常用API、正則表達式,泛型、Collection集合API

Math類的使用。 Math用于做數學運算。Math類中的方法全部是靜態方法,直接用類名調用即可。方法: public static int abs(int a) 獲取參數a的絕對值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…

如何系統地入門學習stm32?

如何系統地入門學習stm32? 作為一個在嵌入式領域摸爬滾打十余年的工程師,看到這個問題,我不禁想起自己當年啃著厚重的數據手冊,對著一塊藍色的PCB板冥思苦想的日子。STM32的學習之路,說難不算特別難,說簡單…

考公:數字推理

文章目錄 1.真題12 312 530 756 ()-3 3 1 12 17 ()356 342 333 324 ()30 28 27 25 () 2215105 1494 1383 1272 ()2 3 8 21 46 ()4/25 1/4 4/9 1 ()39 416 630 848 ()5 8 11 17 () 10714 21 40 77 () 229 2.數字推理方法2.1 差值法2.2 比值法(乘法關系)2.…

自動化測試相關協議深度剖析及A2A、MCP協議自動化測試應用展望

一、不同協議底層邏輯關聯分析 1. OPENAPI協議 OPENAPI 協議核心在于定義 API 的規范結構,它使用 YAML 或 JSON 格式來描述 API 的端點、請求參數、響應格式等信息。其底層邏輯是構建一個清晰、標準化的 API 描述文檔,方便不同的客戶端和服務端進行對接…

2025.04.17【Dendrogram】生信數據可視化:Dendrogram圖表詳解

Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目錄 Dendrogram customizationCustomized c…