密码管理器如何防止跨站点凭证填充攻击?
最近在开发自己的密码管理器,发现用户用浏览器自动填充密码时,担心跨站点凭证填充攻击怎么办?
试过给输入框加上autocomplete="new-password",但好像没用……后来查资料说要结合HIBP API检测弱密码,但具体怎么在前端实现呢?
现在代码是这样写的:
<input type="password"
id="password"
autocomplete="new-password"
oninput="checkPasswordStrength(this.value)">
但测试时发现如果用户复制之前用过的弱密码,系统还是能通过验证。难道只能全靠后端处理吗?
autocomplete="new-password"确实不够,浏览器不会完全买账,尤其是用户主动复制粘贴的时候。防止跨站点凭证填充,关键是让密码管理器能区分“这是新密码”还是“在填登录表单”。更好的写法是结合两个手段:
第一,用正确的 autocomplete 值来标记场景。如果是注册或改密,用:
如果是登录,就用:
这样主流密码管理器(比如 Bitwarden、1Password)才能正确识别上下文,避免自动填充已保存的密码到“新建密码”框里。
第二,前端检测复制行为。你现在的 oninput 只能捕获输入,但复制粘贴不会触发 key events。要监听 cut 和 paste 事件:
然后在 checkPasswordStrength 里做两件事:一是本地跑 zxcvbn 做强度估算,二是如果长度较短或结构简单,考虑调 HIBP API 检查是否出现在泄露库中。注意 HIBP 要用 k-anonymity 方式查,别直接传完整 hash。
最后提醒一点,前端所有检查都只是提示,不能替代后端校验。用户可能绕过 JS,所以密码创建请求到达服务端时,必须再做一次完整校验,包括是否为已泄露密码、是否与用户历史密码重复等。
总之,autocomplete 是给密码管理器的信号,事件监听是防用户绕过,前后端双重校验才是兜底。
autocomplete="new-password"确实防不住,我之前也遇到过这种问题。建议用 HIBP API 检测密码是否被泄露,结合以下代码在前端加一层校验:不过完全防住还是得后端配合,光前端不行。