五月做登录模块复查时,我拿两个不存在的账号试了试。一个提示“用户不存在”,另一个真实账号输错密码时提示“密码错误”。站在开发者角度,这很贴心;站在试探账号的人那边,也同样贴心。
我把提示统一成“账号或密码错误”,然后顺着登录流程往下看。原本以为只是改一句文案,结果翻出了不少藏在角落里的问题。
密码不能直接锁进抽屉
项目没有保存明文密码,这点还好,但旧代码使用的计算方式已经不太合适。我换成专门的密码哈希算法,为每个密码使用独立随机盐,并根据当前机器能力调整计算成本。
连续失败也加了限速,不过没有只按网络地址一刀切。公司、学校和家庭网络可能共用出口,封住一个地址,往往会让无辜的人一起站在门外。
退出真的要退出
另一个问题更实际:用户修改密码后,旧设备上的会话还活着。页面显示“修改成功”,那台旧手机却依然可以继续访问。
现在密码修改、主动退出和权限撤销都会让相关会话失效。会话标识保持随机且短期有效,浏览器里的安全属性也补齐。修改密码、绑定设备这类高风险操作,还会要求用户重新验证一次。
最后我又检查了接口权限。前端把按钮藏起来不叫授权,真正的判断必须留在服务端。认证只说明来的人是谁,授权才决定哪扇门能开。
登录页看着只有两个输入框,背后却像一串门锁。安全不是把门做得难用,而是每把钥匙都能说明去向,丢了以后也确实可以作废。