你有没有遇到过这种情况:登录后台时手滑输错几次密码,结果账号突然被锁住了?别急,这不是系统出bug,而是网站启用了密码错误次数限制策略。这个功能看似不起眼,其实是防止暴力破解的第一道防线。
为什么需要限制密码错误次数
想象一下,如果你的网站后台登录页没有任何防护,黑客用自动化工具每秒尝试几十个密码组合,不出几分钟就能撞开一个弱密码账户。加了错误次数限制后,连续输错5次就触发锁定机制,对方只能干瞪眼。这就像家门口装了个带报警器的锁,小偷试几次打不开就会放弃。
常见的实现方式
最简单的做法是在用户表里加个字段,比如 failed_login_attempts 和 lockout_time。每次登录失败就计数加一,达到阈值就记录锁定时间。下次请求进来先查这个状态,符合条件再允许验证密码。
if (user.lockout_time && new Date() < user.lockout_time) {
return res.status(403).json({ error: '账户已锁定,请15分钟后重试' });
}
if (passwordMismatch) {
user.failed_login_attempts++;
if (user.failed_login_attempts >= 5) {
user.lockout_time = new Date(Date.now() + 15 * 60 * 1000); // 锁定15分钟
}
await user.save();
}
配合验证码更稳妥
光靠计数还不够聪明。有些攻击者会分散IP轮流试,避开单个用户的锁定规则。这时候可以在第3次失败后弹出验证码,把机器行为挡在外面。人眼识别图片里的扭曲字母没问题,脚本可搞不定这个。
别忘了给用户提示
朋友老张就碰过这事:他老婆着急改产品价格,连输错三次密码,第四次明明对了却登不上去。打电话问他才知系统已经锁定,但页面只显示“用户名或密码错误”。后来他在前端加了句“连续错误5次将锁定账户”,还做了倒计时提示,这类问题少了一大半。
进阶技巧:动态调整策略
固定规则容易被摸清套路。可以考虑动态策略——第一次锁定5分钟,第二次15分钟,第三次直接要邮箱验证。或者根据IP异常程度自动收紧限制,来自陌生地区的请求多罚几次。
这种策略特别适合电商后台、会员系统这类有真实用户登录场景的地方。既防住了批量扫描,又不会让正常人频繁掉链子。