先记住这个答案
密码字段的 autocomplete 应告诉浏览器它是现有密码还是新密码:登录用 current-password,注册和重设用 new-password。off 只是提示,并不可靠阻止浏览器或密码管理器填充;强行关掉反而可能妨碍用户使用强密码。若业务要控制会话或认证,应在服务端处理,不能把自动填充开关当安全边界。
- 登录密码用
current-password - 新密码用
new-password - 账号字段可用
username off不是安全控制
注册页密码不该填进旧密码
注册页的“设置密码”框如果错误标成 current-password,密码管理器可能把旧密码填进来。把注册、重设表单标为 new-password,登录表单标为 current-password,再给账号框标 username,有助于浏览器识别流程。一次性验证码可用 one-time-code。公共电脑上的敏感操作应依靠重新认证、会话过期等机制,不能把“关闭自动填充”当作安全边界。
<form action="/login" method="post">
<input name="user" autocomplete="username">
<input type="password" name="password" autocomplete="current-password">
<button type="submit">登录</button>
</form>
<!-- 注册密码框改用 autocomplete="new-password" -->浏览器会综合字段类型、名称、autocomplete token 和用户保存的凭据判断是否填充。
正确 token 帮助密码管理器
规范化 token 给出更清楚的语义,但最终填充行为仍受用户设置和密码管理器策略影响。off 不是强制命令,特别是登录凭据场景,浏览器可能为了用户安全与便利继续提供填充。应用应允许密码管理器生成和使用强密码,同时用服务端认证与权限校验保证安全。
注册页若把新密码字段误标成 current-password,密码管理器可能把已有账号密码填进来;重设密码也可能被误判成登录。相反,登录页用 new-password 会误导生成强密码的流程。应给用户名与密码字段稳定、准确的 name 和 autocomplete token,实际在目标浏览器与密码管理器里走一次注册、登录和重设,不靠一个 off 解决混填。
一次性验证码和新密码也不应混作一个字段。验证码可根据用途给相应的自动填充提示;新密码的 new-password 有助于密码管理器生成并保存强密码。测试中若浏览器没有按预期填充,除了 token 还要看字段标签、name 和页面是否在输入过程中重新创建 DOM 节点。把全部字段都设成 off 往往只是掩盖了字段语义不清。
容易答错的地方
- 以为
autocomplete="off"一定生效 - 浏览器和密码管理器可能仍提供登录凭据,不能把它当成可靠开关。
- 注册和登录密码都写
current-password - 新密码字段应使用
new-password,避免与已保存密码混淆。
面试官还会怎么问?
重设密码页的新密码框写什么?
写 new-password;如有当前密码验证框,那个字段写 current-password。
一次性验证码用什么 token?
可以使用 one-time-code,提示浏览器这是一次性验证码字段。
禁用自动填充能提高安全吗?
不能代替认证和会话保护;阻碍密码管理器还可能让用户选择更弱的密码。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。