前端如何防止频繁登录尝试导致的密码暴力破解?

斯羽 Dev 阅读 166

我现在在做登录功能的安全防护,想限制用户频繁提交密码。之前尝试用前端倒计时禁用提交按钮:setDisabled(true),但用户直接刷新页面就能继续尝试,这样根本没效果。

后端同事说他们已经做了失败次数计数,当超过5次返回429 Too Many Attempts状态码。那前端应该如何配合?直接跳转到锁定页面吗?有没有更好的方式既能防刷新又能友好提示?

我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
南宫亚楠
前端防暴力破解这块我确实踩过坑。你提到的倒计时禁用按钮,说实话我以前也做过,但刷新就能绕过,完全没用。真正有效的做法是得前端后端配合。

既然后端已经做了失败次数限制,并且能返回429状态码,那前端的重点就是处理好这个状态码,并给用户明确的提示。我建议你可以这样处理:

当登录接口返回429时,不要直接跳转到锁定页面,这样体验不好。可以弹出一个模态框或者提示栏,告诉用户“密码尝试次数过多,请稍后再试”,并显示一个倒计时,比如5分钟。这个倒计时不是为了禁用按钮,而是提示用户多久后可以再次尝试。

同时,你可以把倒计时的时间戳存在localStorage里。这样即使用户刷新页面也能继续倒计时,不会立刻又能提交。代码大概是这样:


function showLockTip() {
const lockDuration = 5 * 60 * 1000; // 5分钟
const lockKey = 'login_lock_time';
const now = new Date().getTime();
const lockEndTime = now + lockDuration;

localStorage.setItem(lockKey, lockEndTime.toString());

// 显示倒计时提示
const timer = setInterval(() => {
const remaining = Math.max(0, lockEndTime - new Date().getTime());
const minutes = Math.floor(remaining / 60000);
const seconds = Math.floor((remaining % 60000) / 1000);
console.log(请等待 ${minutes} 分 ${seconds} 秒后重试);
if (remaining <= 0) {
clearInterval(timer);
localStorage.removeItem(lockKey);
console.log('现在可以重新尝试登录');
}
}, 1000);
}


在每次点击登录按钮前,检查一下有没有lockKey存在,如果有的话就提示锁定中,不要发送请求。

这种方式比跳转页面更友好,用户也能清楚知道接下来该怎么做。当然,安全最终还是要靠后端控制,前端只是增强体验。

血泪教训告诉我,前端能做的其实很有限,不要试图“阻止”用户做某些事,而是要引导用户等待或者采取其他方式,比如提供验证码、邮箱验证等替代登录方式。
点赞 10
2026-02-08 08:00