h5敏感表单防自动填充需干扰识别逻辑+引导填充至无害位置:①用autocomplete="new-password"替代off;②在真实密码框前加display:none的type="password"干扰字段;③动态切换type属性(初始text,focus时变password);④打破“text+password”登录结构陷阱。

在 H5 页面中防止转账、支付等敏感表单被浏览器记住密码或自动填充,核心不是“彻底禁止”,而是“干扰识别逻辑+引导填充到无害位置”。现代浏览器(Chrome、Edge、Safari)已基本无视 autocomplete="off",尤其对 type="password" 字段会强制启用填充。以下方法经实测有效,兼顾兼容性与可靠性。
用 autocomplete="new-password" 替代 off
对注册、改密、支付确认等需要用户输入新密码的场景,autocomplete="new-password" 是语义正确且被主流浏览器广泛支持的方案。它明确告诉浏览器:“这不是要填旧密码,而是创建一个新密码”,从而避免错填已保存的凭据。
- 适用于:新设支付密码、二次验证密码、重置 PIN 码等字段
- 不要用于登录页的密码框——那里应使用
autocomplete="current-password",反而更安全、更可控 - 配合
form autocomplete="off"使用效果更稳,但单独使用已足够应对多数情况
插入隐藏干扰字段
浏览器自动填充时,会按 DOM 顺序扫描第一个可见的 type="password" 元素并优先填充它。可利用这点,在真实密码框前加一个结构合法但不可见的干扰项,把填充“引走”。
- 干扰字段必须是
type="password",且不能加disabled或readonly - 用
style="display:none;"隐藏,确保它参与 DOM 解析;避免用hidden属性或visibility:hidden - 干扰字段的
name应避开敏感名(如不用name="password"),推荐name="fake_pwd"并在服务端忽略
动态切换 type 属性
让真实密码框初始为 type="text",等用户聚焦(focus)时再切为 type="password"。这样可绕过页面加载阶段的预填充时机。
- HTML 中写:
<input id="pay-pwd" type="text" name="pay_password"> - JS 中监听:
document.getElementById('pay-pwd').addEventListener('focus', e => { e.target.type = 'password'; }); - 注意:需同时清空初始值(
value=""),否则可能残留旧内容
避免触发“登录模式”的结构陷阱
浏览器常将“一个 text + 一个 password”连续排列的结构识别为登录表单。在支付确认页、转账授权页中,要主动打破这种模式。
- 在用户名/账号输入框和密码框之间插入一个非敏感字段(如金额确认提示、滑块验证、或带
display:none的占位 input) - 避免将多个密码类字段(如“原支付密码”“新支付密码”“确认密码”)紧挨着放置;中间插入其他语义无关但结构合法的元素
- 不使用通用 name 值(如
name="password"、name="pwd"),可改用业务化命名(如name="transfer_auth_code")











