必须用原生,因其具备浏览器底层保护(禁自动填充、不缓存明文、限制调试器读取value);需配autocomplete="current-password"、autocapitalize="off"等属性,并强制https与服务端bcrypt哈希。

移动端登录页用 type="password" 输入密码,核心不是“让它看起来安全”,而是让整个输入链路不被系统过度干预、不被意外泄露、不绕过防护机制。它本身不加密,但配合得当,能守住第一道可见性防线。
必须用原生 type="password",别搞“伪密码框”
不能用 type="text" 加 text-security: disc 或透明光标遮盖——输入值仍是明文,JS 可随时读取,录屏、键盘记录器、调试器全都能捕获。浏览器对 type="password" 有底层保护:禁用默认自动填充(除非显式允许)、不缓存明文、限制开发者工具直接访问 value(部分上下文),这是不可替代的基线。
autocomplete 和 autocapitalize 要设对,不是关掉就完事
登录页的密码框,必须设 autocomplete="current-password"。这不是为了“关自动填充”,而是明确告诉浏览器和密码管理器:“这是当前账户正在使用的密码,请安全填充”。设 autocomplete="off" 基本无效,Chrome、Safari 都会忽略,还可能触发 iOS 键盘首字母大写,反而暴露密码结构。
同时加上:
构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等
-
autocapitalize="off":防 iOS 自动大写第一个字符 -
autocorrect="off"和spellcheck="false":避免拼写纠正干扰输入节奏 - name 属性别用
pwd或password,改用user_login_credential这类弱语义、高唯一性的值,降低浏览器凭 name 匹配历史密码的风险
移动端键盘与显示控制要务实
iOS Safari 默认弹出字母键盘,Android 多数是混合键盘。如果业务只要求纯数字(如 PIN),type="password" 不合适,应换 type="tel" inputmode="numeric";但若密码需大小写字母+数字+符号,就用 inputmode="text" 强制调出全键盘。
小眼睛图标(密码可见切换)是浏览器原生功能,满足 type="password" 就自动出现,无需 JS。点击后临时切为 type="text",失焦再切回。如需自定义样式,可隐藏原生图标并实现按钮逻辑,但切换必须只改 input.type,不要重建节点或 clone 元素,否则影响焦点和可访问性。
前端只是起点,HTTPS 和服务端才是真防线
type="password" 只解决“用户眼前看不到明文”这一个问题。它不加密、不防抓包、不防 XSS。所以:
- 表单
method="POST"提交,必须走 HTTPS,否则 POST body 中的password=123456会在网络中裸奔 - 服务端收到后立即用 bcrypt 或 Argon2 加盐哈希,绝不可存明文、Base64 或简单 MD5
- 登录接口要限速(如 5 次/分钟/IP),错误提示统一为“用户名或密码错误”,不区分是否存在该用户
- 前端
pattern或minlength仅作体验提示,服务端必须完整复现校验逻辑










