找回密码的验证码,强度和错误锁定该怎么配
找回密码的验证码、登录验证码和公开表单用的验证码,看着是同一个控件,要防的其实不是一件事。位数与随机来源决定它能不能被猜中,有效期决定被截获后还有多久可用,错误次数锁定决定能不能反复试。三项要一起配,缺任何一项都能被绕过。
三类验证场景要的不是一件事
| 场景 | 主要风险 | 强度取向 | 锁定与时效 |
|---|---|---|---|
| 找回密码 | 票据被猜中或复用 | 随机来源要可靠,位数不能太少 | 有效期短,按单次使用作废 |
| 登录 | 批量撞库 | 失败计数比位数更关键 | 绑定同一入口做错误次数锁定 |
| 公开表单 | 机器批量提交 | 交互验证更适合 | 配合频率限制,不宜只靠图形码 |
找回密码这一类的关键在于「一次性」:验证码在核验通过后应当立即作废,避免同一个码被重复提交。PbootCMS 在 V3.2.25(build 2026-09-08)的更新日志里就加固了找回密码验证码,改为 6 位安全随机生成,并增加过期时间与错误次数锁定,方向和上面三项一致。
位数与随机来源为什么重要
位数不够时,配合无限次尝试,穷举成本会低到可以忽略。所以「加长位数」和「限制尝试次数」是成对出现的,只做其中一项收益有限。
更常被忽略的是随机来源。用可预测的规则拼出的码,即使位数达标,仍然可能在有限尝试内命中。安全随机生成解决的是这一层:不依赖时间戳、不依赖顺序编号。
同一类问题在站内修复记录里也有对应:v3.6.6 处理过站点切换场景下登录凭证可被伪造的隐患,做法是改成一次性票据,同时建议轮换签名密钥并修改管理员密码。这类改动的共同点是——把「可复用的凭证」变成「用完即废的凭证」。
有效期与错误次数锁定怎么配
有效期按业务流程定:找回密码的场景里用户通常会在几分钟内完成填写,过期时间没必要留长;留长的代价是给了对方更多尝试窗口。
错误次数锁定要绑定同一入口。按账号锁、按目标邮箱锁、按来源地址锁,防的是不同打法:只锁账号挡不住换一个账号继续试同一邮箱,只锁地址挡不住换 IP。配置时要确认锁计数与解锁条件写在一起,别出现锁了却没自动解除的情况。
机器人防护与内容防护的分工
表单防机器人这一步,站内支持在表单接入 reCAPTCHA 这类验证码,把判断交给交互验证而不是自绘图形码。它的价值在于抗批量提交,但它不是内容安全的全部:即使提交动作合法,内容本身仍可能带风险。
安企CMS 的内容安全设置里,敏感词过滤与关键词替换、内容审核处理的是提交内容的表述风险,而 JWT 认证、对 SQL 注入和 XSS 的防御处理的是接口与页面层风险。三层分工是:reCAPTCHA 挡机器,敏感词过滤管表述,认证与注入防护管通道。留言与评论这类入口要三层一起看,只开一层就会留下明显的绕过路径。
自查清单
- 找回密码验证码是否为安全随机生成、是否有过期时间、核验通过后是否作废;
- 错误次数锁定是否绑定到具体入口,是否有解锁路径;
- 公开表单是否接入交互验证,且与频率限制同时开启;
- 评论内容是否走敏感词过滤与审核,而不是只看提交频率;
- 版本升级说明里点到需要轮换密钥与修改管理员口令的,是否真的执行过。
常见问题
问:位数多一点,是不是就不用做错误锁定了? 答:不是。位数提高单次猜中难度,锁定限制尝试次数,两者相乘才是实际强度。
问:表单已被垃圾信息淹没,先加图形码还是先加频率限制? 答:先看提交是否来自同一入口的批量请求。是批量,就先上交互验证与频率限制;是内容有问题,再补敏感词过滤与审核。
问:后台自己的登录要不要开验证码? 答:建议按风险开。后台入口暴露在公网时,失败计数与锁定比前台更重要。