ChatGPT解决这个技术问题 Extra ChatGPT

您如何在 Web 表单字段/输入标签上禁用浏览器自动完成功能?

您如何在主要浏览器中禁用特定输入(或表单字段)的自动完成功能?

在某些系统中,测试人员必须一遍又一遍地手动输入大量信息,将选项设置为可配置的可能很有用,这样在测试时您可以禁用它,只需点击“选项卡 > 向下箭头 > 选项卡 > 向下箭头等”。 。
试试 github.com/terrylinooo/disableautofill.js ,它使用 JavaScript 跳过浏览器的自动填充功能。
这个问题正在 meta 上讨论。

d
double-beep

Firefox 30 忽略密码的 autocomplete="off",而是选择提示用户是否应将密码存储在客户端上。请注意 2014 年 5 月 5 日的以下 commentary

密码管理器总是提示是否要保存密码。未经用户许可,不会保存密码。我们是继 IE 和 Chrome 之后第三个实现此更改的浏览器。

根据 Mozilla Developer Network 文档,布尔表单元素属性 autocomplete 可防止表单数据缓存在旧版浏览器中。

<input type="text" name="foo" autocomplete="off" />

这在 Firefox 3.0.3 中对我不起作用,我必须将自动完成属性放在 FORM 而不是 INPUT 中。
自动完成仅在 HTML 5 标准中定义,因此它会破坏您针对 HTML 4 运行的任何验证。*...
@Winston,您应该将它放在表单和输入元素本身上。这样你就涵盖了浏览器的所有非标准性。
并且记得在测试您的网络应用程序之前禁用您的 autocomplete = on 扩展程序(如果您使用的是 Chrome)。否则你会像我一样觉得自己很傻。 ;)
很惊讶,为什么这个答案被接受并且有这么多选票。即使没有像其他人所说的那样特别。根据我的发现,@Ben Combee 在此线程中提供了最具体且经过验证的解决方案。
T
Thoshitha Kaduruwewa

除了设置 autocomplete=off 之外,您还可以让生成页面的代码随机化您的表单字段名称,可能通过在名称末尾添加一些特定于会话的字符串。

提交表单后,您可以在服务器端处理它们之前剥离该部分。这将阻止 Web 浏览器为您的字段查找上下文,也可能有助于防止 XSRF 攻击,因为攻击者无法猜测表单提交的字段名称。


与使用 autocomplete="off" 相比,这是一个更好的解决方案。您所要做的就是在每次页面加载时生成一个新名称并将该名称保存到 $_SESSION 以供将来使用:$_SESSION['codefield_name'] = md5(uniqid('auth', true));
不,这不是一个更好的解决方案,因为此设置的首选来源是用户代理,也称为 Web 浏览器。支持某些行为(HTML 5 试图这样做)和通过代表用户决定来强制它是有区别的,你建议这是一个“更好的解决方案”。
该解决方案适用于所有浏览器,因此在这方面它“更好”。不过,amn 是正确的,代表您的用户决定禁用自动完成并不是一个好主意。这意味着我只会在非常特定的情况下禁用自动完成功能,例如当您计划构建自己的自动完成功能并且不希望发生冲突或奇怪行为时。
关于 XSRF 攻击,我不确定您描绘的是哪种类型的攻击,但攻击者不能像您在服务器端识别字段的方式一样剥离末端部分吗?或者如果攻击者发布这些字段,他们不能附加自己的随机字符串,因为它会被服务器剥离吗?
@macguru2000 构建自己的自动完成功能是一个完全合法且常见的用例。确实,浏览器应该让开发人员在需要时更容易关闭自动完成功能,而不是强迫我们使用像这样的黑客
Z
Zub

大多数主要浏览器和密码管理器(正确的,恕我直言)现在忽略 autocomplete=off

为什么?许多银行和其他“高安全性”网站“出于安全目的”在其登录页面中添加了 autocomplete=off,但这实际上降低了安全性,因为它会导致人们在这些高安全性网站上更改密码以便于记忆(从而破解) 因为自动完成功能被破坏了。

很久以前,大多数密码管理器开始忽略 autocomplete=off,现在浏览器开始只对用户名/密码输入做同样的事情。

不幸的是,自动完成实现中的错误将用户名和/或密码信息插入到不适当的表单字段中,导致表单验证错误,或者更糟糕的是,意外地将用户名插入到用户故意留空的字段中。

网络开发人员要做什么?

如果您可以将所有密码字段单独保留在页面上,那将是一个很好的开始,因为似乎密码字段的存在是用户/密码自动完成的主要触发因素。否则,请阅读以下提示。

Safari 注意到有 2 个密码字段并在这种情况下禁用自动完成,假设它必须是更改密码表单,而不是登录表单。因此,请确保在您允许的任何表单中使用 2 个密码字段(新密码和确认新密码)

不幸的是,Chrome 34 会在看到密码字段时尝试使用用户/密码自动填充字段。这是一个非常糟糕的错误,希望他们会改变 Safari 的行为。但是,将此添加到表单顶部似乎会禁用密码自动填充:

我尚未彻底调查 IE 或 Firefox,但如果其他人在评论中有信息,我很乐意更新答案。


“在你的页面上添加这个似乎会禁用页面的自动填充:”你是什么意思?
@wutzebaer,Chrome 会注意到隐藏的密码字段并停止自动完成。据报道,这是为了防止网站在用户不注意的情况下窃取密码信息。
您的代码片段阻止 Chrome、Firefox、IE 8 和 IE 10 上的登录字段自动完成。没有测试 IE 11。好东西!只有简单的答案仍然有效。
您好,从 2022 年开始。我刚刚尝试过这个解决方案,它仍然适用于 Firefox 101.0.1,但不适用于 Chrome 102.0.5005.115
P
Peter Mortensen

有时,即使 autocomplete=off 也不会阻止将凭据填写到错误的字段中,但不会阻止用户或昵称字段。

此解决方法是 apinstein's post 关于浏览器行为的补充。

修复浏览器自动填充只读并在焦点上设置可写(单击和选项卡)

 <input type="password" readonly
     onfocus="this.removeAttribute('readonly');"/>

更新:

Mobile Safari 在字段中设置光标,但不显示虚拟键盘。新修复程序像以前一样工作,但它处理虚拟键盘:

<input id="email" readonly type="email" onfocus="if (this.hasAttribute('readonly')) {
    this.removeAttribute('readonly');
    // fix for mobile safari to show virtual keyboard
    this.blur();    this.focus();  }" />

现场演示https://jsfiddle.net/danielsuess/n0scguv6/

// 更新结束

因为浏览器自动将凭据填充到错误的文本字段!?

当有相同形式的密码字段时,我注意到 Chrome 和 Safari 上的这种奇怪行为。我猜浏览器会寻找一个密码字段来插入您保存的凭据。然后它自动填充(只是根据观察猜测)最近的文本输入字段,该字段出现在 DOM 中的密码字段之前。由于浏览器是最后一个实例,您无法控制它。

上面的这个只读修复对我有用。


如果没有 javascript,那么整个表单都会失败。 -1
@JimmyKane 的关键是首先使用javascript添加属性(dsuess 在这里没有这样做,只是为了完整性而添加)。
@tmelson 我明白了,但为什么还要使用 js 来禁用?让我们避免使用 js 来进行本机可以改进的事情。不过,我再次同意你的看法。
13 年后,这仍然是最好的选择——对于我们这些使用 JQuery 的人来说,这里有一个快速修改:onfocus="$(this).attr('readonly',false);"
这不是解决方案。如果 JS 在页面中不起作用,是的,它会失败。而且,您做了一个鼠标事件,但许多用户在输入输入时不使用鼠标。
P
Peter Mortensen

Chrome 的解决方案是在输入类型密码中添加 autocomplete="new-password"。请检查下面的示例。

例子:

<form name="myForm"" method="post">
   <input name="user" type="text" />
   <input name="pass" type="password" autocomplete="new-password" />
   <input type="submit">
</form>

如果 Chrome 找到一个 type password 框,它总是会自动完成数据,这足以指示该框 autocomplete = "new-password"

这对我很有效。

注意:使用 F12 确保您的更改生效。很多时候,浏览器将页面保存在缓存中,这给我一个不好的印象,它不起作用,但浏览器并没有真正带来变化。


这在 Chrome 中也适用于其他类型的字段,而不仅仅是 type="password"。
我将它与密码、电子邮件和文本类型一起使用,并且有效。我只是这样使用它: autocomplete="new"
autocomplete="nope" name="pswd" 并在真实密码输入字段之前使用 。这对我有用。
这现在几乎适用于所有浏览器,而不仅仅是 Chrome:autocomplete#Browser_compatibility
这是目前最好的答案。有关详细信息,请参阅本页末尾:developer.mozilla.org/en-US/docs/Web/Security/…
P
Peter Mortensen
<form name="form1" id="form1" method="post"
      autocomplete="off" action="http://www.example.com/form.cgi">

这适用于 Internet Explorer 和 Mozilla Firefox。缺点是它不是 XHTML 标准。


我注意到将它添加到表单元素并不总是阻止它应用于表单中的单个输入。因此,最好将其直接放在输入元素上。
实际上@sholsinger,最好将它放在表单和输入元素本身上。这样你就涵盖了浏览器的所有非标准性。
遗憾的是,从 IE 11 开始,Microsoft 不再尊重 input type="password" 的这一点。希望没有其他浏览器选择删除此功能。
form 上设置 autocomplete="off" 是唯一适用于 Chrome 的方法。
P
Peter Mortensen

正如其他人所说,答案是autocomplete="off"

但是,我认为值得说明为什么在某些情况下使用它是一个好主意,因为对此的一些答案和duplicate questions建议最好不要关闭它。

停止浏览器存储信用卡号码不应该留给用户。太多的用户甚至不会意识到这是一个问题。

在信用卡安全码字段上将其关闭尤为重要。如 this page 所述:

“永远不要存储安全码......它的价值取决于提供它的唯一方法是从实体信用卡中读取它的假设,证明提供它的人实际上持有卡。”

问题是,如果它是公共计算机(网吧、图书馆等),那么其他用户很容易窃取您的卡详细信息,甚至在您自己的计算机上,恶意网站也可能steal autocomplete data


如果我去了一个网站,它在下拉菜单中记住了我的卡,我会很不高兴。我开始怀疑他们怎么会这么粗心。
更简单/更关键的情况。当我访问网站管理部分的用户页面时,它会尝试将他们的用户名和密码设置为我的管理员用户名和密码,但无法判断这不是登录表单。我想记住我的管理员密码,但这是一个严重错误,它试图将记住的用户名/密码应用于我随后编辑的任何用户。
s
step

始终有效的解决方案

我已经通过使用随机字符解决了与谷歌浏览器的无休止的斗争。当你总是用随机字符串渲染自动完成时,它永远不会记住任何东西。

<input name="name" type="text" autocomplete="rutjfkde">

希望它对其他人有所帮助。

2022 年更新:

Chrome 进行了这项改进:autocomplete="new-password" 这将解决它,但我不确定 Chrome 是否会在一段时间后再次将其更改为不同的功能。


这效果更好。您可以添加一个小 JS,为每次页面加载生成一个随机代码,并将该代码添加到输入字段:<code>函数 autoId(){ var autoId = ""; var dict = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for(var i=0; i<12; i++){ autoId += dict.charAt(Math.floor(Math.random() * dict.length)); } 返回自动识别码; } $('.autocompleteoff').attr('autocomplete', autoId());</code>您可以将 autocompleteoff 类添加到所需的输入字段。
Chrome 已修复现在使用标准化的“关闭”
可悲的是,它比所谓的 chrome 标准效果更好
今天我发现Chrome会用“Off”覆盖随机字符串。我不敢相信 Chrome 开发人员做这个属性不好而且不受控制。为什么哦,我得到了。
autocomplete="off" 适用于 2022 年的 Firefox
C
Chris Baker

我不得不乞求与那些说避免禁用自动完成的答案不同。

首先要提出的是,未在登录表单字段上明确禁用自动完成是 PCI-DSS 失败。此外,如果用户的本地计算机遭到破坏,那么任何自动完成数据都可以被攻击者轻易获得,因为它是以明文形式存储的。

可用性肯定存在争议,但是在哪些表单字段应该禁用自动完成功能和哪些不应该禁用时,存在一个非常好的平衡。


我刚刚注意到,当您使用 AutoComplete 填充文本输入时,IE 不会触发 onChange 事件。我们有几十个表单和一千多个 onChange 事件(输入验证、业务逻辑)分散在其中。最近我们将 IE 升级到了新版本,突然间奇怪的事情开始发生。幸运的是,我们正在运行一个 Intranet 应用程序,并且自动完成对我们来说不是 UX 问题,关闭它更容易。
如果用户的本地计算机受到威胁,他们就完蛋了。它可能安装了键盘记录器,可能添加了伪造的 SSL 根证书并通过虚假代理发送所有内容等。我有一个真正的理由禁用自动完成功能 - 当我以管理员身份登录并访问编辑用户页面时,它会分配该用户我的管理员用户名和密码。我需要防止这种行为。
浏览器供应商似乎在寻找自己的利益。保存的密码 = 用户锁定。而且自动完成的开/关太简单了——为什么不采用复杂的语义提示标准(html.spec.whatwg.org/multipage/…),顺便说一下,它允许浏览器从每个用户访问的站点收集有价值的语义数据?
我试图解决的具体用例是:他们已经登录。但现在他们将要访问更敏感的东西。我想展示一个让他们重新进行身份验证的对话,以防止他们走开抽烟并且坏人坐在他们的椅子上的可能性。尝试了几种技术来击败自动完成,但没有任何效果。现在我在想,也许,至少,使用旧的 'password = window.prompt(" Please re-enter your password")' 加上会话中的用户名,并尝试对其进行身份验证。
P
Peter Mortensen

三个选项:

第一的:

<input type='text' autocomplete='off' />

第二:

<form action='' autocomplete='off'>

第三(JavaScript代码):

$('input').attr('autocomplete', 'off');

第一个和第二个选项应该是一个选项,因为它因浏览器处理此问题的方式而异。
试过 $formElement.attr('autocomplete', 'off');它不起作用。
D
DisplayName

这对我有用。

<input name="pass" type="password" autocomplete="new-password" />

我们也可以在文本、选择等其他控件中使用此策略


R
Raghav Dinesh

在一个相关的或实际上,在完全相反的音符上——

“如果您是上述表单的用户并且想要重新启用自动完成功能,请使用此书签页面中的“记住密码”书签。它会从页面上的所有表单中删除所有 autocomplete="off" 属性。保留打好仗!”


M
Murat Yıldız

此外

autocomplete="off"

利用

readonly onfocus="this.removeAttribute('readonly');"

对于您不希望他们记住表单数据的输入(usernamepassword 等),如下所示:

<input type="text" name="UserName" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

<input type="password" name="Password" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

希望这可以帮助。


对于 IE11 中的我来说,即使 onfocus 删除了 readonly 属性,我也无法在文本框中输入内容。但是,如果我再次单击文本框,则可以输入。
我在 IE11 上遇到了同样的问题(直到第二个焦点才能输入)。添加模糊然后再次聚焦有效。 $(document).on('focus', 'input:password[readonly="readonly"]', function () { $(this).prop('readonly', false).blur().focus(); });
@Andrew当然,你可以。这是克服这个问题的核心原则,我还添加了一个包含完整代码示例的更新;)
我还添加了 onfocusout="this.setAttribute('readonly', 'readonly');"
J
Jibran Khan

只需设置 autocomplete="off"。这样做有一个很好的理由:您想提供自己的自动完成功能!


P
Peter Mortensen

在这次谈话中,没有一个解决方案对我有用。

我终于想出了一个不需要任何 JavaScript 的纯 HTML 解决方案,可以在现代浏览器中运行(Internet Explorer 除外;必须至少有一个问题,对吧?),并且不需要您禁用整个表单的自动完成功能.

只需关闭 form 上的自动完成功能,然后为您希望它在表单中工作的任何 input 打开它。例如:

<form autocomplete="off">
    <!-- These inputs will not allow autocomplete and Chrome
         won't highlight them yellow! -->
    <input name="username"  />
    <input name="password" type="password" />
    <!-- This field will allow autocomplete to work even
         though we've disabled it on the form -->
    <input name="another_field" autocomplete="on" />
</form>

S
SuperBiasedMan

我一直在尝试无尽的解决方案,然后我发现了这个:

只需简单地使用 autocomplete="false" 而不是 autocomplete="off"

就这么简单,它在谷歌浏览器中也像一个魅力!


正如您在 chrome 中所说,关闭值不起作用。它必须是“假的”
在 Chrome 44.0.2403.130 上为我工作。
试过这个: $formElement.attr('autocomplete', 'false');抱歉不起作用。
P
Peter Mortensen

我们确实在一个站点上使用了 sasb 的想法。

这是一个运行医生办公室的医疗软件网络应用程序。然而,我们的许多客户都是外科医生,他们使用了许多不同的工作站,包括半公共终端。因此,他们希望确保不了解自动保存密码的含义或没有注意的医生不会意外地让他们的登录信息易于访问。

当然,这是在 Internet Explorer 8、Firefox 3.1 等开始出现隐私浏览的想法之前。即便如此,许多医生仍被迫在 IT 不会改变的医院中使用老式浏览器。

因此,我们让登录页面生成仅适用于该帖子的随机字段名称。是的,它不太方便,但它只是让用户头疼的是不在公共终端上存储登录信息。


这里没有任何名为“sasb”的当前用户(包括已删除的答案)。 (尽管对某些已删除答案的评论不再可见。)它指的是什么答案(或评论)?
G
GDP

我认为 HTML 5 支持 autocomplete=off

问问自己为什么要这样做——在某些情况下这可能是有道理的,但不要仅仅为了这样做而这样做。

这对用户来说不太方便,甚至在 OS X 中也没有安全问题(下面由 Soren 提到)。如果您担心人们的密码被远程盗取 - 即使您的应用使用 autcomplete=off,击键记录器仍然可以做到这一点。

作为选择让浏览器记住(大部分)我的信息的用户,如果您的网站不记得我的信息,我会觉得很烦人。


C
Cava

最佳解决方案:

防止自动完成用户名(或电子邮件)和密码:

<input type="email" name="email"><!-- Can be type="text" -->
<input type="password" name="password" autocomplete="new-password">

防止自动完成字段:

<input type="text" name="field" autocomplete="nope">

解释:autocomplete<input> 中继续工作,autocomplete="off" 不起作用,但您可以将 off 更改为随机字符串,例如 nope

工作于:

铬:49、50、51、52、53、54、55、56、57、58、59、60、61、62、63 和 64

火狐:44、45、46、47、48、49、50、51、52、53、54、55、56、57和58


我发现这在我的初步测试中有效。太奇怪了,“关闭”不起作用。
这不适用于 Android 上的 Chrome。我尝试为 autocomplete 属性设置字符串值,但它仍将以前的条目显示为输入下的自动完成建议。
@tebs1200 哪一个?密码字段还是文本字段?
@Cava 对延迟回复感到抱歉。文本字段。我将 autocomplete 设置为什么值并不重要,我仍然会根据之前输入的值获得一个建议下拉列表。在桌面上很好,但在 Android chrome 上不行。
P
Peter Mortensen

为字段使用非标准名称和 ID,因此“name”而不是“name_”。浏览器将不会将其视为名称字段。

最好的部分是您可以对某些(但不是全部)字段执行此操作,它会自动完成一些(但不是所有)字段。


这样做的问题是,如果任何其他网站使用“name_”来实现相同的目标,那么你又回到了原点。
所以让它成为“mysite_name”。如果其他人正在使用它,我会问他们问题...
这弄乱了一些自动填充实用程序
P
Peter Mortensen

添加 autocomplete="off" 不会减少它。

input 类型属性更改为 type="search"
Google 不会将自动填充应用于具有搜索类型的输入。


这是一个黑客。该字段不是搜索字段。将来这可能会引起麻烦。
P
Peter Mortensen

我刚遇到这个问题并尝试了几次失败,但这一次对我有用(在 MDN 上找到):

在某些情况下,即使自动完成属性设置为关闭,浏览器也会继续建议自动完成值。这种意想不到的行为可能会让开发人员感到非常困惑。真正强制不完成的技巧是为属性分配一个随机字符串,如下所示:

autocomplete="nope"

在 MDN 上,您添加的那个链接没有提到任何带有“nope”的内容。也许页面已经改变?
J
Jonas G. Drange

添加

autocomplete="off"

到表单标记将禁用该特定表单中所有 input 字段的浏览器自动完成功能(之前在该字段中键入的内容)。

测试:

火狐 3.5、4 测试版

互联网浏览器 8

铬合金


g
garfbradaz

所以这里是:

function turnOnPasswordStyle() { $('#inputpassword').attr('type', "password"); }


如果样式文本框以防止可见密码闪烁,这看起来是个好主意。
非常感谢,这完成了 +1 的工作,我对您的解决方案的修改是通过单行实现:
@HasnaaIbraheem 谢谢(:有时可读性更好。
这是我可以让它工作的唯一方法 - readonly attr 工作但搞砸了标签顺序。
一个解释将是有序的。例如,想法/要点是什么?它在什么上进行了测试(包括版本)?
P
Peter Mortensen

为了避免无效的 XHTML,您可以使用 JavaScript 设置此属性。使用 jQuery 的示例:

<input type="text" class="noAutoComplete" ... />

$(function() {
    $('.noAutoComplete').attr('autocomplete', 'off');
});

问题是没有 JavaScript 的用户将获得自动完成功能。


这并不能避免无效的 xhtml,它只是在您检查它之后动态添加无效位,它声明它是有效的!
@Andiih:那么有没有办法让自动完成在 xhtml 中工作?
工作(或停止工作,这是目标):是的,如上所述。但有效 - 不。
6
6 revs, 4 users 69%

这是浏览器现在忽略的安全问题。浏览器使用输入名称来识别和存储内容,即使开发人员认为该信息是敏感信息并且不应存储。

使两个请求之间的输入名称不同将解决问题(但仍会保存在浏览器的缓存中,也会增加浏览器的缓存)。

要求用户在浏览器设置中激活或停用选项并不是一个好的解决方案。该问题可以在后端解决。

这是修复。所有自动完成元素都是使用隐藏输入生成的,如下所示:

<?php $r = md5(rand() . microtime(TRUE)); ?>
<form method="POST" action="./">
    <input type="text" name="<?php echo $r; ?>" />
    <input type="hidden" name="__autocomplete_fix_<?php echo $r; ?>" value="username" />
    <input type="submit" name="submit" value="submit" />
</form>

然后服务器像这样处理 post 变量:(Demo)

foreach ($_POST as $key => $val) {
    $newKey = preg_replace('~^__autocomplete_fix_~', '', $key, 1, $count);
    if ($count) {
        $_POST[$val] = $_POST[$newKey];
        unset($_POST[$key], $_POST[$newKey]);
    }
}

可以照常访问该值

echo $_POST['username'];

并且浏览器将无法建议来自先前请求或先前用户的信息。

即使浏览器更新他们的技术以忽略/尊重自动完成属性,这将继续有效。


P
Peter Mortensen

我不敢相信这在被报道这么久之后仍然是一个问题。以前的解决方案对我不起作用,因为 Safari 似乎知道元素何时未显示或不在屏幕上,但以下解决方案对我有用:

<div style="height:0px; overflow:hidden; ">
  Username <input type="text" name="fake_safari_username" >
  Password <input type="password" name="fake_safari_password">
</div>

那么,把它放在实际的用户名和密码字段之前有效吗?浏览器填充了那些而不是真实的
P
Peter Mortensen

如果只是 autocomplete="off" 不起作用,也试试这些:

autocorrect="off" autocapitalize="off" autocomplete="off"

React 的自动完成功能... $0.02
J
Jakob Løkke Madsen

此处提到的所有技巧都不适用于 Chrome。这里有一个关于这个问题的讨论:https://code.google.com/p/chromium/issues/detail?id=468153#c41

<form> 中添加它是有效的(至少现在是这样):

<div style="display: none;">
    <input type="text" id="PreventChromeAutocomplete" name="PreventChromeAutocomplete" autocomplete="address-level4" />
</div>

请注意,使用此技术,FireFox 实际上仍会自动填充该隐藏字段,该隐藏字段将在提交表单时包含在内。这可能很糟糕,因为密码将通过潜在的不安全连接传输。幸运的是,添加 maxlength="0" 确实可以防止 Firefox 自动填充该字段。
P
Peter Mortensen

您可以在 input 中使用它。

例如;

<input type=text name="test" autocomplete="off" />