Answers:
Firefox 30会忽略autocomplete="off"
密码,而是选择提示用户是否将密码存储在客户端上。请注意以下2014年5月5日的评论:
- 密码管理器总是提示是否要保存密码。未经用户许可,不会保存密码。
- 在IE和Chrome之后,我们是第三个实现此更改的浏览器。
根据Mozilla开发人员网络文档,布尔表单元素属性autocomplete
可防止将表单数据缓存在较旧的浏览器中。
<input type="text" name="foo" autocomplete="off" />
除了之外autocomplete=off
,您还可以通过生成页面的代码将表单字段名称随机化,也许可以通过在名称末尾添加一些特定于会话的字符串来实现。
提交表单后,您可以先剥离该部分,然后再在服务器端对其进行处理。这将阻止Web浏览器查找您的字段的上下文,也可能有助于防止XSRF攻击,因为攻击者将无法猜测表单提交的字段名称。
$_SESSION['codefield_name'] = md5(uniqid('auth', true));
现在,大多数主要的浏览器和密码管理器(正确的是IMHO)都会忽略autocomplete=off
。
为什么?许多银行和其他“高安全性”网站autocomplete=off
“出于安全目的” 添加到其登录页面中,但这实际上降低了安全性,因为这会导致人们更改这些高安全性站点上的密码,因为自动完成功能很容易记住(因而可以破解)坏了。
很久以前,大多数密码管理器开始忽略autocomplete=off
,现在浏览器开始仅对用户名/密码输入执行相同的操作。
不幸的是,自动完成实现中的错误将用户名和/或密码信息插入不适当的表单字段中,从而导致表单验证错误,或者更糟的是,意外地将用户名插入用户故意留空的字段中。
Web开发人员要做什么?
铬不幸的是, 34会在看到密码字段时尝试使用用户/密码自动填充字段。这是一个非常糟糕的错误,希望它们会改变Safari的行为。但是,将其添加到表单顶部似乎会禁用密码自动填充功能:
<input type="text" style="display:none">
<input type="password" style="display:none">
我尚未对IE或Firefox进行彻底调查,但是如果其他人在评论中有信息,我将很乐意更新答案。
type='password'
在一页上创建两个字段会导致浏览器的“保存密码”自动完成功能被忽略,这很有意义,因为登录表单只要求输入一次时,注册表单就会要求输入两次密码。
有时,即使autocomplete = off也不会阻止将凭据填充到错误的字段中,但不能阻止将用户或昵称字段填充。
此解决方法是apinstein关于浏览器行为的文章的补充。
修复浏览器以只读方式自动填充并设置为可写焦点(单击和标签)
<input type="password" readonly
onfocus="this.removeAttribute('readonly');"/>
更新:Mobile Safari在该字段中设置了光标,但不显示虚拟键盘。New Fix的工作原理与以前相同,但是可以处理虚拟键盘:
<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/
// UpdateEnd
因为浏览器会自动将凭据填充到错误的文本字段!?
当密码字段的格式相同时,我会在Chrome和Safari上发现这种奇怪的行为。我猜想,浏览器会寻找一个密码字段来插入您保存的凭据。然后,它会自动填充(仅出于观察目的而猜测)最接近的类似文本的输入字段,该字段出现在DOM中的密码字段之前。由于浏览器是最后一个实例,您无法控制它,
上面的只读修复对我有用。
readonly
删除,随后选择该字段将导致自动完成返回。
<form name="form1" id="form1" method="post"
autocomplete="off" action="http://www.example.com/form.cgi">
这将在Internet Explorer和Mozilla FireFox中运行,缺点是它不是XHTML标准。
input type="password"
。希望没有其他浏览器选择删除此功能。
autocomplete="off"
在上进行设置form
是唯一适用于Chrome的功能。
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找到一个密码类型的框,它总是自动完成数据,足以指示该框autocomplete = "new-password"
。
这对我来说很好。
注意:请确保F12
您的更改生效,许多浏览器将页面保存在缓存中,这给我留下了不好的印象,即该页面不起作用,但浏览器实际上并未带来更改。
正如其他人所说,答案是 autocomplete="off"
但是,我认为值得说明的是为什么在某些情况下使用它作为对此问题的一些答案并重复使用是一个好主意问题表明最好不要关闭它。
停止将存储信用卡号的浏览器留给用户。太多的用户甚至没有意识到这是一个问题。
尤其是在信用卡安全码字段中将其关闭非常重要。如该页面所述:
“永远不要存储安全代码。它的价值取决于以下假设:提供该安全代码的唯一方法是从实物信用卡中读取该密码,从而证明提供该密码的人实际上持有该卡。”
问题是,如果这是一台公用计算机(网络咖啡馆,图书馆等),那么其他用户很容易窃取您的卡详细信息,即使是在您自己的计算机上,恶意网站也可能窃取了自动填充数据。
我已经通过使用随机字符解决了与Google Chrome的无休止的斗争。当您始终使用随机字符串呈现自动完成功能时,它将永远不会记住任何内容。
<input name="name" type="text" autocomplete="rutjfkde">
希望对其他人有帮助。
autocompleteoff
类添加到所需的输入字段中。
为了避免禁用自动完成功能,我不得不与这些回答有所不同。
首先要提到的是,未在登录表单字段上明确禁用自动完成功能是PCI-DSS失败。另外,如果用户的本地计算机受到威胁,则由于攻击者会以无格式存储任何自动完成的数据,因此攻击者可以轻松获取这些数据。
当然,可用性是有争议的,但是在哪些表单字段应禁用自动完成功能以及哪些不应该禁用自动完成功能方面,这是一个很好的平衡。
在此对话中,没有任何解决方案对我有用。
我终于想通了一个纯HTML的解决方案,需要没有使用Javascript,在现代浏览器上运行(IE除外;有过至少1捕,对吧?),并且不要求您为整个表单自动完成禁用。
只需关闭上的自动完成功能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>
这对我有用。
<input name="pass" type="password" autocomplete="new-password" />
我们还可以在其他控件(例如文本,选择等)中使用此策略
此外
autocomplete="off"
采用
readonly onfocus="this.removeAttribute('readonly');"
对于输入,你不希望他们能记住表单数据(username
,password
等),如下图所示:
<input type="text" name="UserName" autocomplete="off" readonly
onfocus="this.removeAttribute('readonly');" >
<input type="password" name="Password" autocomplete="off" readonly
onfocus="this.removeAttribute('readonly');" >
希望这可以帮助。
$(document).on('focus', 'input:password[readonly="readonly"]', function () { $(this).prop('readonly', false).blur().focus(); });
onfocusout="this.setAttribute('readonly', 'readonly');"
最佳解决方案:
防止自动填充用户名(或电子邮件)和密码:
<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
Firefox:44、45、46、47、48、49、50、51、52、53、54、55、56、57和58
autocomplete
属性设置字符串值,但该属性仍将先前的条目显示为输入下的自动完成建议。
autocomplete
,我仍然会根据先前输入的值获得建议下拉列表。在台式机上很好,但在Android chrome上不行。
添加autocomplete="off"
不会削减它。
将输入类型属性更改为type="search"
。
Google不会将自动填充应用于具有搜索类型的输入。
在字段中使用非标准名称和ID,因此“名称”不是“名称”。这样浏览器就不会将其视为名称字段。最好的部分是您可以对部分但不是全部字段执行此操作,它将自动完成部分但不是全部字段。
为了避免无效的XHTML,您可以使用javascript设置此属性。使用jQuery的示例:
<input type="text" class="noAutoComplete" ... />
$(function() {
$('.noAutoComplete').attr('autocomplete', 'off');
});
问题是没有JavaScript的用户将获得自动完成功能。
我很难相信这已经被报道了这么久了。上面的解决方案对我不起作用,因为safari似乎知道何时不显示元素或不在屏幕外,但是以下内容对我有用:
<div style="height:0px; overflow:hidden; ">
Username <input type="text" name="fake_safari_username" >
Password <input type="password" name="fake_safari_password">
</div>
希望对某人有用!
就是这样:
function turnOnPasswordStyle() {
$('#inputpassword').attr('type', "password");
}
<input oninput="turnOnPasswordStyle()" id="inputpassword" type="text">
这是浏览器现在忽略的安全问题。浏览器会使用输入名称来标识和存储内容,即使开发人员认为该信息是敏感的,也不应该存储。将输入名称更改为两个请求之间的值将解决问题(但仍将保存在浏览器的缓存中,并且还会增加浏览器的缓存)。要求用户激活或禁用浏览器设置中的选项不是一个好的解决方案。该问题可以在后端修复。
这是我的解决办法。我在框架中实现的一种方法。所有自动完成元素都是使用隐藏输入生成的,如下所示:
<? $r = rmd5(rand().mocrotime(TRUE)); ?>
<form method="POST" action="./">
<input type="text" name="<? echo $r; ?>" />
<input type="hidden" name="__autocomplete_fix_<? echo $r; ?>" value="username" />
<input type="submit" name="submit" value="submit" />
</form>
然后,服务器处理以下变量:
foreach ($_POST as $key => $val)
{
if(preg_match('#^__autocomplete_fix_#', $key) === 1){
$n = substr($key, 19);
if(isset($_POST[$n]))$_POST[$val] = $_POST[$n];
}
}
该值可以照常访问
var_dump($_POST['username']);
而且浏览器将无法根据先前的请求或先前的用户来建议信息。
即使浏览器进行了更新,所有功能都像超级按钮一样,都希望忽略或不忽略自动完成功能。这是为我解决此问题的最佳方法。
这里提到的所有骇客都无法在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>
maxlength="0"
确实可以防止Firefox自动填充字段。