登錄次數限制

文章目錄

        • 一、應用場景與設計目的
          • 1. 應用場景
          • 2. 設計目的
        • 二、功能設計
          • 1. 登錄限制規則
          • 2. 解鎖機制
          • 3. 適用維度
        • 三、技術實現
          • 1. 數據存儲
          • 2. 邏輯流程
          • 3. 實現代碼示例
          • 4. 動態鎖定時間
        • 四、安全增強與擴展
          • 1. 防止用戶名枚舉
          • 2. 加入驗證碼
          • 3. 監控與報警
          • 4. 分布式支持
        • 五、設計思考
        • 六、總結

現在應用中,大部分都有登錄模塊——獲取系統權限的第一道防線。面對登錄框,黑客有很多攻擊手段,暴力破解就是其中一種低成本攻擊方法。所以登錄次數限制功能成為了必要的防護措施。


一、應用場景與設計目的
1. 應用場景
  • 防御暴力破解攻擊:攻擊者嘗試通過自動化工具測試大量用戶名和密碼組合。
  • 防止資源濫用:惡意用戶可能通過頻繁的登錄嘗試,增加服務器負擔,甚至造成拒絕服務。
  • 提高用戶數據安全性:通過限制失敗嘗試,保護用戶的敏感信息不被非法訪問。
2. 設計目的
  • 安全性:通過限制失敗次數和時間窗口,降低賬戶被暴力破解的風險。
  • 用戶體驗:提供適度的限制和友好的提示信息,避免對正常用戶造成過多干擾。
  • 靈活性:支持基于用戶、IP或設備的多維度限制規則,適應不同場景需求。
  • 性能與擴展性:方案應在高并發環境下高效運行,并支持分布式部署。

二、功能設計
1. 登錄限制規則
  • 失敗次數限制:在固定時間窗口內(如5分鐘)限制嘗試登錄的次數(如最多5次)。
  • 鎖定機制:超過限制后,賬號或IP在一段時間內無法登錄(如10分鐘)。
  • 逐步增加懲罰:對于多次超過限制的用戶,可動態增加鎖定時間。
2. 解鎖機制
  • 自動解鎖:等待鎖定時間結束后自動解除限制。
  • 管理員手動解鎖:在后臺管理系統提供手動解鎖的功能。
  • 多級驗證:對于惡意嘗試較多的用戶,強制加入額外驗證(如驗證碼)。
3. 適用維度
  • 用戶級別:限制特定用戶名的登錄嘗試。
  • IP級別:限制特定IP地址的頻繁嘗試,防止分布式攻擊。
  • 設備級別:針對特定設備標識限制嘗試。

三、技術實現
1. 數據存儲

為了高效記錄和管理登錄嘗試信息,推薦使用緩存系統(如 Redis)。它具有高性能、自動過期和分布式支持的特點。

數據結構設計

  • 鍵:login_attempts:{username}login_attempts:{ip}
  • 值:記錄失敗次數。
  • 過期時間:失敗記錄的生存周期(如5分鐘)。
2. 邏輯流程

以下是登錄次數限制的基本流程:

  1. 檢查當前用戶或IP是否已被鎖定:

    • 如果鎖定,提示用戶鎖定狀態及剩余時間。
  2. 驗證用戶名和密碼:

    • 成功:清除失敗記錄。
    • 失敗:增加失敗次數,更新過期時間,提示剩余嘗試次數。
  3. 當失敗次數超過限制時:

    • 鎖定賬戶或IP,記錄鎖定時間。

    在這里插入圖片描述

3. 實現代碼示例

先引入redis依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

以下為 Java 偽代碼,展示登錄限制的基本實現。后面注入這個bean,根據上面流程圖在對應的地方調用方法就可以了。


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class LoginAttemptService {private final int MAX_ATTEMPTS = 5; // 最大失敗次數private final long LOCK_TIME = 15; // 鎖定時間,單位:分鐘@Autowiredprivate RedisTemplate<String, Object> redisTemplate;private String getRedisKey(String username) {return "login_attempt:" + username;}public void loginFailed(String username) {String redisKey = getRedisKey(username);Integer attempts = (Integer) redisTemplate.opsForValue().get(redisKey);if (attempts == null) {redisTemplate.opsForValue().set(redisKey, 1, LOCK_TIME, TimeUnit.MINUTES);} else {redisTemplate.opsForValue().increment(redisKey);}}public void loginSucceeded(String username) {redisTemplate.delete(getRedisKey(username));}public boolean isLocked(String username) {String redisKey = getRedisKey(username);Integer attempts = (Integer) redisTemplate.opsForValue().get(redisKey);if (attempts != null && attempts >= MAX_ATTEMPTS) {return true;}return false;}public long getRemainingLockTime(String username) {String redisKey = getRedisKey(username);return redisTemplate.getExpire(redisKey, TimeUnit.SECONDS);}
}
4. 動態鎖定時間

這里你可以想辦法保留先前登錄失敗的次數,每錯一次就增加鎖定的時間(類似iPhone)。

鎖定時間可以隨著失敗次數增加,采用指數遞增策略:

  • 第一次鎖定:5分鐘。
  • 第二次鎖定:15分鐘。
  • 第三次鎖定:30分鐘。

偽代碼如下:

private long calculateLockTime(int attempts) {return (long) Math.pow(2, attempts - MAX_ATTEMPTS) * LOCK_TIME;
}

四、安全增強與擴展
1. 防止用戶名枚舉

攻擊者可能通過系統錯誤提示,判斷用戶名是否存在。為此:

  • 登錄失敗統一返回:“用戶名或密碼錯誤”。
2. 加入驗證碼

在嘗試次數接近上限時,強制用戶通過驗證碼驗證,增加破解難度。

3. 監控與報警

記錄登錄失敗日志,通過分析大規模失敗嘗試,發現并阻止潛在的暴力破解行為。

4. 分布式支持

在分布式系統中,使用統一的緩存(如 Redis)存儲失敗記錄,保證所有實例共享數據。


五、設計思考
  1. 如何平衡安全與用戶體驗
    • 過于嚴格的限制可能導致誤鎖定正常用戶,建議提供解鎖選項(如通過郵箱驗證)。
  2. 如何應對復雜攻擊場景?
    • 對于分布式暴力破解,需結合IP限制和設備指紋等多維度數據分析。
  3. 是否需要提供自定義規則?
    • 根據業務場景,允許管理員配置失敗次數、鎖定時間等規則,以適應不同的安全需求。

六、總結
  1. 如何平衡安全與用戶體驗?
    • 過于嚴格的限制可能導致誤鎖定正常用戶,建議提供解鎖選項(如通過郵箱驗證)。
  2. 如何應對復雜攻擊場景?
    • 對于分布式暴力破解,需結合IP限制和設備指紋等多維度數據分析。
  3. 是否需要提供自定義規則?
    • 根據業務場景,允許管理員配置失敗次數、鎖定時間等規則,以適應不同的安全需求。

登錄次數限制是一項核心的安全功能,它不僅能有效防御暴力破解攻擊,還能增強系統的整體安全性。在實現過程中,應兼顧安全性、用戶體驗與系統性能。同時,通過動態調整規則、加入驗證碼和增強監控,可以進一步提升系統的防護能力。


博客主頁: 總是學不會.

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

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

相關文章

計算機畢業設計SpringBoot+Vue.js景區民宿預約系統(源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

(十 五)趣學設計模式 之 命令模式!

目錄 一、 啥是命令模式&#xff1f;二、 為什么要用命令模式&#xff1f;三、 策略模式的實現方式四、 命令模式的優缺點五、 命令模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;可以多多支…

Matlab 大量接單

分享一個matlab接私活、兼職的平臺 1、技術方向滿足任一即可 2、技術要求 3、最后 技術方向滿足即可 MATLAB&#xff1a;熟練掌握MATLAB編程語言&#xff0c;能夠使用MATLAB進行數據處理、機器學習和深度學習等相關工作。 機器學習、深度學習、強化學習、仿真、復現、算法、…

【自學筆記】大數據基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 大數據基礎知識點總覽1. 大數據概述2. 大數據處理技術3. 數據倉庫與數據挖掘4. 大數據分析與可視化5. 大數據平臺與架構6. 大數據安全與隱私 總結 大數據基礎知識點…

17、什么是智能指針,C++有哪幾種智能指針【高頻】

智能指針其實不是指針&#xff0c;而是一個&#xff08;模板&#xff09;類&#xff0c;用來存儲指向某塊資源的指針&#xff0c;并自動釋放這塊資源&#xff0c;從而解決內存泄漏問題。主要有以下四種&#xff1a; auto_ptr 它的思想就是當當一個指針對象賦值給另一個指針對…

CAN總線通信協議學習2——數據鏈路層之幀格式

1 幀格式 幀格式可理解為定義了傳輸的數據&#xff08;叫報文&#xff09;應該“長什么樣”來傳輸&#xff0c;也為后續設定一些規則如錯誤檢查機制提供了思路。 首先&#xff0c;幀格式可分為以下5種類型&#xff1a; PS&#xff1a;CAN總線任意一個設備可當收也可當發&#…

MATLAB中asManyOfPattern函數用法

目錄 語法 說明 示例 匹配盡可能多的模式實例 指定要匹配的最小模式數 指定要匹配的最小和最大模式數 asManyOfPattern函數的功能是模式匹配次數盡可能多。 語法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…

1×1卷積的作用與原理詳解

11卷積的作用與原理詳解 文章目錄 11卷積的作用與原理詳解引言1. 什么是11卷積&#xff1f;2. 11卷積的數學表達3. 11卷積的主要作用3.1 改變通道數&#xff08;升維/降維&#xff09;3.1.1 降維&#xff08;Dimension Reduction&#xff09;3.1.2 升維&#xff08;Dimension I…

網絡配置的基本信息

目錄 一、網絡接口信息 1、關閉虛擬化服務 2、配置臨時IP 3、配置靜態IP 4、常見網絡命令 5、安裝Wireshark 一、網絡接口信息 輸入 ip address&#xff0c;會出現下面的內容 網卡名稱及其含義&#xff1a; 網卡名稱說明lo 表示本地回環地址。 ens32 有線網卡&#xff0c…

dify綁定飛書多維表格

dify 綁定飛書和綁定 notion 有差不多的過程&#xff0c;都需要套一層應用的殼子&#xff0c;而沒有直接可以訪問飛書文檔的 API。本文記錄如何在dify工具中使用新增多條記錄工具。 創建飛書應用 在飛書開放平臺創建一個應用&#xff0c;個人用戶創建企業自建應用。 自定義應…

深入解析Crawl4AI:為AI應用量身定制的高效開源爬蟲框架

引言 在當今數據驅動的時代&#xff0c;人工智能&#xff08;AI&#xff09;和大型語言模型&#xff08;LLM&#xff09;的發展對高質量數據的需求日益增長。如何高效地從互聯網上獲取、處理和提取有價值的數據&#xff0c;成為了研究人員和開發者面臨的關鍵挑戰。Crawl4AI作為…

nginx 動態計算攔截非法訪問ip

需求&#xff1a;在Nginx上實現一個動態攔截IP的方法&#xff0c;具體是當某個IP在1分鐘內訪問超過60次時&#xff0c;將其加入Redis并攔截&#xff0c;攔截時間默認1天。 技術選型&#xff1a;使用NginxLuaRedis的方法。這種方案通過Lua腳本在Nginx處理請求時檢查Redis中的黑…

【軟件測試】論壇系統功能測試報告

文章目錄 1.前言2.項目介紹3. 對項目進行測試3.1 設計測試用例3.2 執行測試用例 1.前言 這次測試是我學習階段的練習&#xff0c;由于缺少需求規格說明等文檔&#xff0c;需要我盡可能發散思維去設計更多的測試用例。但無論如何測試至關重要&#xff0c;以下是核心原因&#x…

MyBatis TypeHandler 詳解與實戰:FastJson 實現字符串轉 List

在 MyBatis 中&#xff0c;TypeHandler 是實現 Java 類型與數據庫類型雙向轉換 的核心組件。無論是處理基礎數據類型還是復雜的 JSON、枚舉或自定義對象&#xff0c;它都能通過靈活的擴展機制滿足開發需求。本文將通過一個 將數據庫 JSON 字符串轉換為 List<User> 的案例…

《HelloGitHub》第 107 期

興趣是最好的老師&#xff0c;HelloGitHub 讓你對編程感興趣&#xff01; 簡介 HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。 github.com/521xueweihan/HelloGitHub 這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等&#xff0c;涵蓋多種編程語言 Python、…

【每日一題 | 2025】2.24 ~ 3.2

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;每日一題 文章目錄 1. 【2.24】P10424 [藍橋杯 2024 省 B] 好數2. 【2.25】P8665 [藍橋杯 2018 省 A] 航班時間3. 【2.26】P10905 [藍橋杯 2024 省 C] 回文字符串4. 【2.27】P10425 [藍橋杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 庫框架設計學習

【03】STM32F407 HAL 庫框架設計學習 摘要 本文旨在為初學者提供一個關于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;庫框架設計的詳細學習教程。通過本文&#xff0c;讀者將從零開始&#xff0c;逐步掌握STM32F407的基本知識、HAL庫的配置步驟…

跟著官方文檔學習UE C++ TArray容器系列 迭代 和 排序

一.首先測試下&#xff0c;官方案例 迭代器的方法&#xff0c;有點不常見。有點像個指針&#xff0c;迭代完還自帶break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“結界”機制:作用域與變量可見性探秘

一、編程世界的“結界”概念 源自佛學的結界概念&#xff0c;在C中體現為作用域機制。程序中的每個函數都會形成獨立的作用域屏障&#xff0c;如同魔法結界般保護內部變量&#xff0c;使其與外界的同名變量互不干擾。這種機制保證了代碼模塊的獨立性和安全性&#xff0c;但當存…

3-6 WPS JS宏 工作表移動復制實例-1(工作表的拆分操作)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…