当前位置: 首页 > news >正文

登录次数限制

文章目录

        • 一、应用场景与设计目的
          • 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. 是否需要提供自定义规则?
    • 根据业务场景,允许管理员配置失败次数、锁定时间等规则,以适应不同的安全需求。

登录次数限制是一项核心的安全功能,它不仅能有效防御暴力破解攻击,还能增强系统的整体安全性。在实现过程中,应兼顾安全性、用户体验与系统性能。同时,通过动态调整规则、加入验证码和增强监控,可以进一步提升系统的防护能力。


博客主页: 总是学不会.

相关文章:

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…...

java jar包内的jar包如何打补丁

问题描述&#xff1a; 主包&#xff1a;hisca.jar&#xff0c;解压后 BOOT-INFO/lib下有其他jar包 因为一个小bug&#xff0c;需要修改这个hisca包下BOOT-INF/lib下的子jar包service-hisca-impl-1.0.0.jar中的一个service类及xml文件 操作步骤&#xff1a; 1、主包jar -xvf …...

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用&#xff0c;如何实现&#xff1f; 在前端开发中&#xff0c;当需要渲染大量数据时&#xff0c;传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中&#xff0c;不仅会导致页面加载缓慢&#xff0c;还可能占用大量内存&#x…...

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式&#xff1a;网络地址转换的奥秘 在计算机网络的世界里&#xff0c;NAT 模式&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;扮演着至关重要的角色。它就像是网络中的翻译官&#xff0c;在不同网络地址之间进行转换&#xff0…...

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…...

无服务边缘融合架构:重新定义云原生应用边界

引言&#xff1a;零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后&#xff0c;全球客房详情页渲染延迟降至35ms&#xff0c;冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务&#xff0c;成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…...

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较&#xff1a;TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化&#xff1a;如何提升数据库查询速度&#xff0c;揭秘实战技巧与挑战 引言 T…...

Nodejs-逐行读取文件【简易版】

“勤奋就是成功之母。”‌ —— 茅以升 目录 逐行读取文件四种方法&#xff1a;Node.js 逐行读取文件的核心方法&#xff1a;同步读取&#xff08;适用于小文件&#xff09;&#xff1a;异步流式处理&#xff08;推荐用于大文件&#xff09;&#xff1a;[使用 readline 模块](h…...

上海市计算机学会竞赛平台2024年5月月赛丙组城市距离之和

城市距离之和 内存限制: 256 Mb时间限制: 1000 ms 题目描述 设 (x,y)(x,y) 与 (x′,y′)(x′,y′) 是平面上的两个点的坐标&#xff0c;它们之间的城市距离定义为 ∣x−x′∣∣y−y′∣∣x−x′∣∣y−y′∣ 给定 nn 个点&#xff0c;请计算所有点对之间的城市距离之和。 …...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

基于Python socket库构建的基于 P2P 的文件共享系统示例

基于 P2P 的文件共享系统 实现方式&#xff1a; 使用 Python 的socket库构建 P2P 网络&#xff0c;节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表&#xff0c;并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时&#xff0c;它会向网络中的其…...

JavaScript 函数重载:灵活应对多场景的编程技巧

在 JavaScript 中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一个常见的需求。尽管 JavaScript 本身并不支持传统意义上的函数重载&#xff08;即在同一个作用域内定义多个同名函数&#xff0c;根据参数的不同调用不同的函数&#xff09;&#xff0c;…...

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

计算机毕业设计SpringBoot+Vue.js汽车销售网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【0010】HTML水平线标签详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 一、水平线标签概述 在HTML中&#xff0c;<hr>标签用于在网页上插入一条水平线&#xff0c;其主要…...

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…...

Netty是如何实现零拷贝的?

大家好&#xff0c;我是锋哥。今天分享关于【Netty是如何实现零拷贝的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty是如何实现零拷贝的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty是一个高性能的Java网络应用框架&#xff0c;它…...

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式

【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式 大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式引言一、系统架构1.1 系统架构图1.2 架构模块说明1.2.1 用户输入1.2.2 大模型(语义理解与意图识别)1.2.3 Agent(问题解析与任务分配)1.2.4 问…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...