支付密码和指纹Token需通过“防识别+断明文+强校验”三重防护:禁用语义化name、动态type切换、插入干扰项;blur后清空.value、禁存本地/URL/日志;后端仅接收加密密文或一次性Token并严格验证。

支付密码和指纹 Token 属于高敏感凭证,不能依赖前端“隐藏”或“禁用自动填充”来保护。现代浏览器(Chrome 120+、Edge 105+、Safari 16.4+)会主动识别并填充 type="password" 字段,甚至绕过 autocomplete="off"。真正有效的防护是“不让浏览器识别为可填充字段 + 阻断明文暴露路径 + 后端强校验”。
避免被识别为支付密码字段
浏览器依据语义(name、type、DOM 位置、上下文)判断是否填充。关键操作包括:
- 不用语义化 name:不写
name="pay_password"、name="fp_token",改用动态生成名,如name="sec_input_7a9f"(每次加载随机) - 初始 type 设为
text或tel,聚焦后才通过 JS 切换为password,避开页面解析阶段的自动填充扫描 - 在真实输入框前插入一个不可见但合法的干扰项:
<input type="password" style="display:none;" autocomplete="new-password">,让浏览器优先填它 - 确保表单有明确的
autocomplete="current-password"字段(如登录密码),否则部分浏览器会忽略new-password指令
切断明文暴露链路
即使用户手动输入,也要防止值被意外读取或残留:
- 输入框失去焦点(
blur)或提交后立即清空.value,避免内存中长期持有明文 - 禁止将支付密码或指纹 Token 写入
localStorage、sessionStorage、URL 参数、cookie或隐藏域 - 不使用
innerHTML、console.log或错误监控 SDK 输出该字段值;服务端日志也需过滤脱敏 - 若需前端参与签名(如调用生物认证 SDK),Token 应由系统原生接口直接透传给加密模块,不经过 JS 变量中转
后端必须承担最终验证责任
所有前端防护都可被绕过,安全边界在服务端:
- 支付密码不传输明文:前端仅传递经设备密钥加密后的密文(如 Android Keystore / iOS Secure Enclave 加密结果),服务端用对应公钥或可信执行环境(TEE)解密校验
- 指纹 Token 必须一次性且有时效:由生物认证 SDK 返回短期有效的 token(如 2 分钟),服务端验证后立即作废,不复用
- 高风险操作强制二次确认:除 Token 外,还需绑定设备指纹、IP 行为分析或短信/邮箱验证码
- 所有接口启用 HTTPS + 严格 CSP + SameSite Cookie,防中间人劫持与 XSS 窃取
兼容密码保险箱与无障碍体验
强行禁用填充会损害合规性与可用性,应引导而非对抗:
- 对登录页保留
autocomplete="current-password",让密码管理器正常工作;支付环节则用无语义字段隔离 - 指纹认证流程走标准 WebAuthn API,而非自定义输入框——浏览器原生支持且不触发自动填充
- 为隐藏字段添加
aria-hidden="true"和tabindex="-1",保障屏幕阅读器不误读 - 华为 ArkWeb、iOS Password AutoFill 等机制依赖表单结构规范,避免脱离
<form></form>标签或使用非标准事件拦截


















