首页 > 解决方案 > 是否可以真正禁用现代浏览器密码字段的自动填充和自动完成功能?

问题描述

在现代浏览器中,自动填充和自动完成的标准是完全忽略autocomplete="off"放置在form. 并插入保存的密码,即使它在用户管理页面中。尽管原因在正确的地方,但它使创建用户管理页面变得非常痛苦。

我团队的 Web 应用程序使用 Angular 7 运行,目前仅支持 chrome。但是我们很有可能需要支持其他浏览器,例如 Internet Explorer、Edge、Firefox 等。

我知道这是一个很大程度上触及的主题,并且我可以找到许多答案与此问题相似的问题(例如 thisthis)。但到目前为止,我发现的每一个解决方案都至少有一个大缺陷。

到目前为止我在 chrome 上尝试过的内容:

1) 使用autocomplete="new-password"

似乎 chrome/chromium 开发人员甚至忽略了type="password".

2)type="text" autocomplete="new-password"与星号字体系列一起使用

这会禁用 chrome 自动填充输入字段并隐藏字母。但最大的缺陷是该值仍然存在,并且可以复制粘贴到不同的字体系列中。输入字段也失去了安全性type="password",任何黑客都可以轻松获取该值。

3)使用-webkit-text-security

这与之前的解决方案几乎相同,但这甚至不是 css 标准,而且很少有浏览器支持它。

4) 将值替换为 *

这是迄今为止我尝试过的最棘手的解决方案。当输入值更改时,我在 typescript 中调用一个函数:将新字符添加到本地字符串,将 DOM 值更改为 * 等于字符数,返回本地保存的值 on (blur)

这给我留下了很多问题需要处理,包括:擦除字符串中的任何字符总是会删除最后一个字符,除了最后一个问题,即使值被完全擦除,第一个字符也将始终保持不变,不得不知道在字符串中删除字符的位置。

该解决方案不太理想。

5) 在浏览器设置中禁用域的密码管理

这确实不是问题的解决方案,因为这意味着我希望用户关闭域的密码管理。这也会导致许多用户可能需要在登录页面上保存密码。

6)随机化[name][autocomplete]

通过将所述值绑定到基于当前时间的随机字符串的一种方式,我可以确保密码字段与浏览器保存的任何字段都不匹配。尽管许多人报告说这适用于所有浏览器,但在使用 chrome 时这似乎对我根本不起作用。对我来说,只要输入的是 .chrome,chrome 就会显示推荐的密码type="password"


到目前为止我看到的解决方案:

1)使用两个输入字段

在我看来,这与我自己的解决方案 4) 的工作方式相同。并且可能会同样麻烦。

2) 使用 jQuery 禁用自动填充插件

这似乎与我正在寻找的非常接近,但问题是它使用了 jQuery。我只能说我被告知我们没有使用 jQuery,而且我可能无法直接使用该插件。

我目前正在寻找一种使用角度实现此功能的方法,并且希望对此提供任何帮助或指导。


如果您知道我上面没有提到的任何解决方案,请发布答案或在评论中给我一个链接。

标签: htmlcssangulartypescriptcross-browser

解决方案


到目前为止,我发现的最佳解决方案是type="text"在密码字段上使用autocomplete="off"并在表单和其中的每个输入字段上使用。

我不会将此标记为答案,但是因为它仍然存在失去type="password"安全功能的重大缺陷。文本字段还允许拼写检查,可以使用 禁用spellcheck="false"。但我读过可以用浏览器设置覆盖它。

在提出更好的解决方案之前,这个问题将一直没有答案。


推荐阅读