现代浏览器忽略 autocomplete="off" 是设计选择而非 bug;密码字段必须用 current-password 等语义化值,或通过隐藏干扰字段、动态创建输入框等前端手段干扰识别,但真正防线在后端二次验证与会话清理。

现代浏览器对 autocomplete="off" 的忽略是默认行为,不是 bug,而是设计选择——指望它拦住密码或银行卡号填充,等于没设防。
为什么 autocomplete="off" 在密码字段上根本不起作用
Chrome、Edge(新版)、Safari 自 2021 年起已将该属性降级为“建议”,尤其对 type="password" 字段,浏览器会主动忽略并强制启用填充逻辑。控制台常报 warning:autocomplete="off" is not supported,但填充照旧发生。
- 常见错误现象:登录页刷新后密码框自动填入旧密码;支付确认页的 PIN 输入框被填入其他网站保存的 6 位码
- 真正起效的是语义化值:
current-password(登录)、new-password(注册/改密)、cc-number(配合cc-exp和cc-csc才能联动识别整套卡信息) -
autocomplete="password"不是标准值,部分浏览器会拒识或乱填;autocomplete="off"单独用于type="password"时,Chrome 直接跳过校验
用隐藏干扰字段骗过浏览器 DOM 扫描逻辑
浏览器自动填充时,会从上到下扫描 DOM,找到第一个 type="password" 元素就填进去——这个行为可被利用,而非对抗。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 干扰字段必须是
type="password",且不能加disabled或readonly(部分浏览器跳过) - 用
style="display:none;",而不是hidden属性或opacity:0——前者确保参与解析,后两者仍可能被识别 - 真实密码框初始设为
type="text",在focus事件中才切换为type="password",避免页面加载瞬间被预填充 - 干扰字段的
name别用password,比如叫fake_pwd,服务端直接忽略该字段
动态创建敏感输入框绕过初始解析阶段
自动填充发生在 HTML 解析和 DOM 构建阶段。如果敏感字段是 JS 加载完才插入的,浏览器大概率不会把它纳入候选列表。
立即学习“前端免费学习笔记(深入)”;
- 不要在 HTML 源码里写死
<input type="password">,改用document.createElement('input')动态生成 - 插入前设置好
autocomplete、name、id,但类型可先设为text,交互时再改 - 注意:若页面启用了 CSP,动态执行
eval或内联脚本可能被拦截,需提前配置script-src - 移动端 WebView(如 iOS WKWebView)对动态创建支持较稳定,但某些安卓 WebView 版本(尤其旧版)可能 fallback 到初始解析逻辑
所有前端手段都只是干扰识别,不是阻断——浏览器仍可能在用户手动触发(如右键“填充密码”)时填入数据。真正的防线永远在后端:高风险操作必须强制重输密码、二次验证、CSRF Token 校验,且所有敏感字段提交后须立即清空 session 中对应缓存。


















