屏蔽输入字符而不输入type = password

时间:2014-03-17 14:43:37

标签: javascript html internet-explorer-11

所以我对保存密码的新浏览器有疑问。说我有一个像这样的密码框:

<input type="password" autocomplete="off" />

iOS 7.1中的IE11和Safari等新浏览器已开始忽略密码框中的autocomplete =“off”,并提供用户保存密码。在我的公司(银行),我们认为这是一个安全问题。

我想知道是否还有人解决了这个问题。也许有人编写了一个javascript插件来掩盖正常输入[type = text],以便尊重autocomplete =“off”属性。

更新

有关更多信息,请参阅msdn上的自动填充文档:http://msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx

6 个答案:

答案 0 :(得分:18)

您可以使用自定义字体输入带有文本类型的假密码:

@font-face {
  font-family: 'password';
  font-style: normal;
  font-weight: 400;
  src: url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf);
}

input.key {
  font-family: 'password';
  width: 100px; height: 16px;  
}
<p>Password: <input class="key" type="text" autocomplete="off" /></p>

JSBin Demo

请注意,这只会引发更多安全问题。

答案 1 :(得分:12)

这是一个想法,但我建议将浏览器的自动填充错误用于不用于登录的密码。可能需要有更好的标准来识别登录屏幕,因此浏览器不必使用启发式搜索type="password"字段。

  

使用type="text"加密带有密码字段的表单,这样浏览器的自动完成算法就会忽略它。当用户在该字段中输入内容时,请切换其type="password"

我不是一个JavaScript程序员,但我攻击JSFiddle以显示它在理论上的运作方式。

也许onfocus也是更好的方式,但我没有尝试过。

答案 2 :(得分:2)

首先,autocomplete = "off"应位于<form>元素上,而不是单个字段。这是因为浏览器通常将给定表单中所有字段的值存储在一起(例如,允许为同一站点保存多个用户名/密码组合)。

在表单中设置它,它应该可以正常工作。 (虽然已保存的密码通常仍会自动完成,因此在测试前请清除密码存储区)

但是,如果这被视为安全问题,我建议你可能会追逐错误的目标。

浏览器提供此功能的原因是因为用户希望能够存储他们的登录凭据。防止他们这样做不会阻止他们想要,如果用户真的想要,他们还有很多方法可以解决它 - 有明确设计的浏览器插件可以杀死你autocomplete = "off"功能并允许保存所有密码。

您的用户如何在最后保存密码最终不是您的安全问题,也不是您无论如何都无法控制的。

事实上,如果我们阻止人们存储他们的密码,他们更有可能在多个地方使用相同的密码(仅仅因为人们没有能力为他们使用的每个网站记住不同的密码),因此,通过阻止他们保存它,您实际上可能会使用户的密码更少安全。

如果您的网站确实需要无法保存密码的安全性,那么您需要完全考虑替代机制。例如,银行登录这些天通常要求用户输入密码中的特定编号字符 - 例如“请输入密码中的第五,第八和第十二个字符”

然而,这些方案更多的目的是确保密码的传输而不是存储密码:只输入某些给定的字符,我们根本不需要输入或传输整个密码,所以没有它在途中被黑客攻击的可能性。仍然假设用户可能会在某处记下密码(特别是如果他们必须计算出字符串中的第12个字符)

这种方案对用户来说可能是一个真正的痛苦,但确实提供了真正的登录安全级别,而无需实际输入或传输密码。然而,它为登录过程增加的额外难度意味着只有像银行这样的高安全性网站才有可能使用这种方案而不是常规密码。

答案 3 :(得分:1)

对我有用的解决方案是这样的:

第一个输入类型应为text

在焦点事件中,将输入类型更改为password

收听用户输入,如果输入字段值为空,请再次将类型设置为text

这样,在开始时以及当输入字段为空时,浏览器都不会显示建议。

答案 4 :(得分:0)

您是否尝试过将名称属性更改为荒谬的内容?我相信自动完成功能基于name属性。我不是100%肯定,但在有限的测试中我更改了name属性,正在改变正在呈现的自动填充数据的类型。

明显的例子就是要明确:name =&#34; username&#34;在显示我的用户名时,名字=&#34;电子邮件&#34;显示我之前输入的电子邮件地址。当我切换到name =&#34; browsersAreStupidForImplementingThisFeature&#34;我没有获得任何自动填充数据。

需要进一步测试,但可能是一个好的开始?祝你好运

答案 5 :(得分:0)

我们有一个用例,管理员可以查看其他用户记录并进行更改。字段之一是该其他用户的密码。在这种情况下,让密码管理器预先填写该字段是一件“坏事”。所以我们最终要做的是在页面加载后等待一小段时间,然后清除密码字段...

// After the page has loaded...
window.addEventListener('load', setTimeout(function() {
  // Wait a bit and then clear out the contents of the field
  document.getElementById('other-password').value='';
}), 100);