前端如何防止频繁登录尝试导致的密码暴力破解? 斯羽 Dev 提问于 2026-02-08 07:57:24 阅读 166 安全 我现在在做登录功能的安全防护,想限制用户频繁提交密码。之前尝试用前端倒计时禁用提交按钮:setDisabled(true),但用户直接刷新页面就能继续尝试,这样根本没效果。 后端同事说他们已经做了失败次数计数,当超过5次返回429 Too Many Attempts状态码。那前端应该如何配合?直接跳转到锁定页面吗?有没有更好的方式既能防刷新又能友好提示? 登录限制认证授权 我来解答 赞 12 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 南宫亚楠 Lv1 前端防暴力破解这块我确实踩过坑。你提到的倒计时禁用按钮,说实话我以前也做过,但刷新就能绕过,完全没用。真正有效的做法是得前端后端配合。 既然后端已经做了失败次数限制,并且能返回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 加载更多 相关推荐 1 回答 214 浏览 React登录限制如何防止频繁尝试导致接口被攻击? 我给登录表单加了防抖和错误次数限制,但测试时发现攻击者还是能不断重试,这是为什么? 现在用useState记录错误次数,超过3次就禁用按钮,还用了防抖处理: const Login = () =>... UX凌薇 安全 2026-02-04 11:19:27 2 回答 73 浏览 前端登录表单加了输入限制,为什么还是被暴力破解尝试? 我给登录表单加了最小输入长度和错误次数限制,但监控显示攻击者还是能频繁尝试。代码这样写的: 登录 let failedAttempts = 0; document.getElementById('lo... 诸葛艳君 安全 2026-01-31 09:38:27 2 回答 28 浏览 Vue3跨端开发时如何避免频繁更新导致的性能问题? 在用Vue3+Vant4开发小程序和H5时遇到个问题,列表组件在快速滑动时频繁触发更新,导致UI卡顿。比如商品列表根据滚动位置动态计算显示状态, <template> <van-li... W″志鸣 移动 2026-02-11 10:28:40 2 回答 15 浏览 如何在发送表单时对敏感数据进行加密? 我现在在做一个登录表单,需要把用户名和密码发到后端。但直接用POST提交不安全,想在前端加密后再发送。尝试过用Base64编码,但同事说这根本不算加密。想问下实际开发中该怎么处理? 比如这个表单: &... Des.子晴 安全 2026-02-10 20:05:25 1 回答 13 浏览 微前端中多个Vue子应用如何安全共享Vuex状态而不冲突? 我在用Single-SPA搭建微前端时遇到问题:有两个Vue子应用需要共享用户登录状态,尝试在父应用通过Vuex持久化存储,但发现状态会被另一个子应用覆盖,这是为什么呢? 我在父应用store.js设... 百里毓琳 前端 2026-02-10 16:54:24 2 回答 33 浏览 前端如何有效过滤输入框中的特殊字符防止XSS攻击? 我在做登录表单时发现,用户可以通过输入框发送类似;alert(1)的恶意代码。尝试用正则表达式过滤,但发现当用户快速输入时,分号还是能通过。还试过在CSS里加了这段样式: input { /* 尝试用... 茜茜的笔记 安全 2026-02-08 11:26:54 1 回答 28 浏览 微前端应用间如何安全共享状态而不污染全局变量? 我在用qiankyun搭建微前端项目时,两个子应用需要共享用户登录状态。之前尝试把状态挂载到window上,但发现不同子应用可能覆盖字段,而且测试时发现全局变量残留导致内存泄漏。试过用provider... A. 圣贤 前端 2026-01-29 14:11:30 1 回答 7 浏览 微前端预加载如何避免重复加载相同模块? 我在用qiankun搭建微前端时,尝试给两个子应用配置预加载,发现它们都引用了lodash,但每次预加载都会重复加载这个模块,导致打包体积增大。我尝试在主应用里用import('lodash')提前加... 书生シ柚溪 框架 2026-02-18 12:15:24 1 回答 6 浏览 Vue项目中如何防止Cookie被劫持导致会话劫持? 我在用Vue做登录功能时发现,用js-cookie保存token的Cookie没设置HttpOnly,这样会不会容易被XSS攻击导致Session劫持? // 登录成功后设置Cookie的代码 met... Code°兴娜 安全 2026-02-17 23:49:24 2 回答 10 浏览 如何防止用户输入中的单引号导致SQL注入漏洞? 我在开发登录页面时发现,当用户输入类似' OR 1=1--的恶意用户名时,后端查询直接返回了所有用户数据。虽然我在前端用了正则过滤了单引号:username.replace(/'/g, ''),但测试... UX-豫豪 前端 2026-02-15 09:34:41
既然后端已经做了失败次数限制,并且能返回429状态码,那前端的重点就是处理好这个状态码,并给用户明确的提示。我建议你可以这样处理:
当登录接口返回429时,不要直接跳转到锁定页面,这样体验不好。可以弹出一个模态框或者提示栏,告诉用户“密码尝试次数过多,请稍后再试”,并显示一个倒计时,比如5分钟。这个倒计时不是为了禁用按钮,而是提示用户多久后可以再次尝试。
同时,你可以把倒计时的时间戳存在localStorage里。这样即使用户刷新页面也能继续倒计时,不会立刻又能提交。代码大概是这样:
在每次点击登录按钮前,检查一下有没有lockKey存在,如果有的话就提示锁定中,不要发送请求。
这种方式比跳转页面更友好,用户也能清楚知道接下来该怎么做。当然,安全最终还是要靠后端控制,前端只是增强体验。
血泪教训告诉我,前端能做的其实很有限,不要试图“阻止”用户做某些事,而是要引导用户等待或者采取其他方式,比如提供验证码、邮箱验证等替代登录方式。