禁用浏览器自动填充无效,现代浏览器忽略autocomplete=”off”并可能反向触发密码填充;软键盘可绕过按键监听但无法防粘贴和移动端原生输入;前端哈希不替代HTTPS,必须确保全链路HTTPS传输。
密码输入框直接禁用浏览器自动填充有用吗
没用。设置 autocomplete="off" 在现代浏览器(Chrome 80+、Edge 90+)中已被忽略,浏览器会优先按字段名(如 name="password")或 type="password" 自动触发填充,甚至强制覆盖该属性。更糟的是,部分浏览器会把 autocomplete="off" 当作“需要填充”的信号,反而更积极地弹出密码管理器。
实操建议:
- 用非标准
name属性,比如name="usr_passwd_v2"而非name="password" - 动态生成
id和name,例如在组件挂载后通过 JS 修改,让静态扫描失效 - 避免在 DOM 初始渲染时就写死
type="password",可先设为type="text",聚焦后再切回type="password"(需配合视觉遮罩)
前端加一层“软键盘”真能防键盘记录吗
不能彻底防,但能绕过绝大多数基于 hook API 或底层按键监听的键盘记录器——因为软键盘不触发 keydown/input 事件,所有输入都走 DOM 操作。
关键限制和坑点:
立即学习“前端免费学习笔记(深入)”;
- 无法防御剪贴板粘贴(
paste事件仍可被捕获),必须同时监听并清洗clipboardData - 移动端软键盘会唤起原生输入法,失去控制权;所以软键盘更适合桌面端高敏场景(如银行后台)
- 需禁用右键菜单、拖放、选中文本(
onselectstart="return false"+user-select: none) - 示例核心逻辑:
document.getElementById('soft-keyboard-1').addEventListener('click', e => { const btn = e.target; if (btn.dataset.char) { const input = document.getElementById('pwd-field'); input.value += btn.dataset.char; // 手动触发 input 事件供 Vue/React 响应 input.dispatchEvent(new Event('input', { bubbles: true })); } });
用 inputmode 和 autocapitalize 会影响安全性吗
不影响安全,但错误配置反而暴露意图。比如 inputmode="numeric" + autocapitalize="none" 组合,会让 iOS 键盘只显示数字,明显暗示这是密码字段(尤其当旁边还有“登录”按钮时)。