输入多次密码后如何限制用户规定时间内禁止再次登录

类似的问题:用户输入三次密码错误之后,如何限制用户十分钟内禁止登录?

首先我们要明确的就是在多次输错密码之后限制的是用户还是IP。

一般情况下建议使用IP地址为单位来进行限制,而非具体的用户,这样可以避免影响到真实用户的使用,减少误伤其他用户的可能性。

例如,一个非法用户拿着别人的账户不断尝试,或者其他用户在输错账户的情况下,不断尝试错误密码,如果直接将其限制登录了,那么账户本人也就无法登录自己的账户了。因此,以IP地址为单位来限制相对更加合理。

同时,以IP地址为单位进行限制还可以避免其他攻击行为,比如黑客通过使用同一IP地址进行暴力破解的攻击行为,也可以提供高系统的安全性和稳定性。

但实际情况下我们还要考虑不同场景下的策略调整、粒度控制等因素,以达到用户的最佳体验和安全性能的一个平衡。

使用Redis的常见做法

后台使用Redis记录当前IP尝试登录的次数:

  • key为该IP请求登录的唯一标识
  • value为当前IP的尝试登录次数

我们需要给这个key设置一个过期时间,用来实现指定时间内无法再次登录的效果,而不是永久无法登录。并且,每次key对应的value进行修改时,都需要重置过期时间。

整个逻辑也很简单(假设错误阈值为3):

  1. 当用户提交用户名和密码登录时,先哦按段是否有对应的key
  2. 如果没有对应key的话,说明是第一次登录,直接校验用户名和密码的正确性即可。用户名和密码校验通过,则返回登录成功;否则,就返回登陆失败,用户名/密码错误,并创建对应的key,key对应的值为1,代表其已经请求尝试登录过1次了。
  3. 如果有对应的key,说明不是第一次登录了,需要判断key对应的value大小是否小于3。
  4. 如果小于3则代表还能继续尝试登录,重复密码校验这一步。用户名和密码校验通过,则返回登录成功;否则,就返回登录失败,用户名/密码错误,并将key对应的value值+1(建议使用Lua脚本,涉及到get、incr、expire三个操作)。
  5. 如果value等于3,则表明IP已经尝试登录过三次,返回输入错误次数达到3次,请xx分钟后再尝试。
不使用Redis的常见做法

直接在用户表中增加两个字段

  1. 输错密码次数num
  2. 禁止登录的截至时间点lock-time

我们需要记录输错密码次数num,当输入正确密码后重置num和lock-time字段的值,当输错密码次数达到3次后,修改lock-time为允许再次登录的时间,

整个逻辑也很简单(假设错误阈值为3):

  1. 当用户提交用户名和密码登录时,先判断当前时间点是不是比lock-time小。
  2. 如果比lock-time小的话,说明当前用户暂时被限制登录,返回输入错误次数达到3次,请xx分钟后再尝试。
  3. 如果大于等于lock-time的话,表名当前未被限制登录,进一步判断num大小是否小于3。
  4. 如果小于3则代表还能继续尝试登录,用户名和密码校验通过,则返回登录成功,并重置num和lock-time字段值;否则,就返回登陆失败,用户名/密码错误,并将num的值+1。
  5. 如果num=3,则表明该IP已经尝试登录过3次,返回输入错误次数达到3次,请xx分钟后再尝试。
密码控件可以帮助应用程序实现更强的安全性,通过设置多种规则来确保用户创建足够复杂的密码。以下是常见的几种可以应用于密码控件的控制规则: ### 1. 最小长度和最大长度限制 这是最基本的规则之一,规定了允许输入的最小字符数和最大字符数。短于最低要求的密码会被拒绝接受,而超出上限的部分可能会被截断或导致提交失败。 #### 示例: - **最小长度**:8个字符以上 - **最大长度**:不限制(取决于具体需求) ```csharp passwordCtrl.MinLength = 8; // 设置最小长度为8个字符 passwordCtrl.MaxLength = 64; // 设置最大长度为64个字符 ``` ### 2. 字符种类组合约束 强制包含不同类型字符以增加复杂度。例如,要求密码中必须含有大写字母、小写字母、数字以及特殊符号等。 #### 规则示例: - 至少一位大写字母 `[A-Z]` - 至少一个小写字母 `[a-z]` - 至少一个数字 `[0-9]` - 至少一个非字母数字字符 `(如 ! @ # $ % ^ & *)` ```javascript function validateComplexity(password) { var regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/; return regex.test(password); } ``` ### 3. 禁止重复模式检测 防止简单的重复序列出现在密码内,比如连续递增/递减数字 (`123`, `abc`) 或相同的字符多次出现 (`aaaa`). #### 检测策略: - 对于相邻位置间的简单增量变化进行扫描; - 相邻几个字符之间是否有明显的规律性分布; ### 4. 排除常见词汇列表 阻止使用容易猜解出来的常用词作为个人识别信息的一部分,像姓名缩写、生日日期之类的私密资料不应暴露在公开渠道上。 #### 数据来源: - 可下载已知弱口令字典数据库; - 内置黑名单过滤系统自动屏蔽敏感关键词汇; ### 5. 时间维度校验 有些安全措施还包括时间间隔方面的考量,即两次更改密码时间差不能太近,避免短期内频繁修改带来的潜在风险。 #### 具体做法: - 记录上次更新记录并在一定期限过后才允许再次变更; - 提供通知提醒服务告知何时能继续下一步行动。 综上所述,合理地运用这些密码规则不仅提高了系统的防护等级,也促进了良好的网络安全习惯养成。当然,在实际开发过程中还需要结合实际情况选择合适的方式加以实施,并且持续关注最新的行业标准和技术动态,保证所采取的安全方案始终处于最佳状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leighteen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值