禁用浏览器的“保存密码”功能

464

在政府医疗机构工作的乐趣之一就是必须处理与 PHI(受保护健康信息)有关的所有偏执狂。别误会,我完全支持尽一切可能保护个人信息(健康、财务、上网习惯等),但有时人们会变得太敏感。

举个例子:最近我们的一个州客户发现浏览器提供了方便的“保存密码”功能。我们都知道这个功能已经存在了一段时间,是完全可选的,每个用户自行决定是使用还是不使用,但目前出现了一些骚动,我们被迫寻找一种方法来禁用我们网站的该功能。

问题:是否有一种方法可以让网站告诉浏览器不要提示记住密码?我从事网络开发已经很长时间了,但以前好像没有遇到过这种情况。

感谢任何帮助。


7
您应该提供一个Greasemonkey脚本,以便用户可以重新启用它。我认为用户不喜欢被强制每次都输入密码... - ThiefMaster
19
这个问题值得点赞,因为它既有用又清晰明了。另一方面,我不希望人们找到这个“问题”的解决方案。 - Ian Boyd
14
这并不总是一个"问题"。我来这里是因为Firefox提示我保存一个包含WiFi/SSID密码而不是登录用户名/密码的表单密码。这非常恼人,我想停止它。 - srd
2
如果信息非常重要,那么它应该不仅仅通过密码来保护。 - Sam Watkins
2
你应该通过正确设置autocomplete=标签来鼓励使用密码管理器,这是提高安全性的方法。 - Stuart
显示剩余6条评论
36个回答

337

我不确定它是否适用于所有浏览器,但你应该尝试在表单上设置autocomplete="off"。

<form id="loginForm" action="login.cgi" method="post" autocomplete="off">

最简单和最简便的方式是使用自动完成表单元素属性,值为“off”,以禁用表单和密码存储提示并防止表单数据在会话历史记录中缓存。
来自https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion 一些小的研究显示这也适用于IE,但我不能保证;) @Joseph:如果有一个严格的要求需要通过实际标记的XHTML验证(不知道为什么会这样),你可以理论上在之后使用JavaScript添加此属性,但是禁用js的用户(可能是您的用户群体中可忽略的数量或零,如果您的网站需要js)仍将保存其密码。
使用jQuery的示例:
$('#loginForm').attr('autocomplete', 'off');

52
HTML5规范中已经加入了autocomplete属性,因此现在该属性是有效的。 - Tyler Egeto
12
仅供参考,微软决定Internet Explorer 11不再支持在input type="password"字段中使用autocomplete="off"。http://msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx - JW Lim
7
正如@JWLim提到的那样,IE 11已经停止支持禁用密码保存功能,火狐浏览器也是如此。https://bugzilla.mozilla.org/show_bug.cgi?id=956906 - Gregory Cosmo Haun
3
很遗憾,Firefox也效仿了微软的做法,同样“移除”了自动填充支持。详见以下问题讨论中第100条评论:https://bugzilla.mozilla.org/show_bug.cgi?id=956906 - Bouncing Bit
8
现在不支持Firefox 38+ https://www.mozilla.org/en-US/firefox/38.0/releasenotes/ - Illuminator
显示剩余7条评论

64
我不知道。请提供更多上下文或具体内容以获取更准确的翻译。
autocomplete="off"

使用

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

如果您不希望记住表单数据(如用户名密码等),可以按以下方式输入:

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

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

已在主流浏览器的最新版本上进行测试,即Google ChromeMozilla FirefoxMicrosoft Edge等,表现良好。


3
@Murat Yıldız:我需要实现相同的功能,我按照你的代码进行了操作。在所有浏览器中都可以正常工作。谢谢! - Sree
3
刚刚测试了 Mozilla Firefox 52.0Google Chrome 57.0Microsoft Edge 38.1,效果很好! - Murat Yıldız
1
在Safari移动版中可能会出现错误,因为此答案正在修复它 https://dev59.com/MXVD5IYBdhLWcg3wXacd - Ferie
2
Windows Firefox 57.0.2(64位)在我实施后仍建议保存密码。 - Panu Haaramo
1
刚刚尝试使用这种方法,它只在Chrome中有效。在Opera、Firefox或Internet Explorer中无法使用。 - chenks
显示剩余16条评论

38

我曾经遇到这个问题很久,但问题有一个独特的变化。 特权用户无法使用保存的密码登录,但普通用户需要。 这意味着特权用户必须登录两次,第二次则强制不保存密码。

由于密码可能已经在第一次登录时被保存,因此使用标准的autocomplete="off"方法在所有浏览器上都无法解决此问题。 我的同事找到了一个解决方案:当焦点在密码字段上时,用新的密码字段替换它,然后将焦点放在新的密码字段上(然后连接同一个事件处理程序)。 这种方法有效(除了在IE6中会导致无限循环)。 也许有一种方法可以避免这种情况,但是它让我头痛不已。

最终,我尝试将用户名和密码放在表单之外。 令人惊讶的是,这个方法行得通! 它适用于Linux上的 IE6、当前版本的Firefox和Chrome。 我还没有进行更多测试,但我认为它在大多数(如果不是所有)浏览器中都有效(但如果有浏览器不在意是否有表单,那也不奇怪)。

下面是一些示例代码,以及一些jQuery代码使其可行:

<input type="text" id="username" name="username"/>
<input type="password" id="password" name="password"/>

<form id="theForm" action="/your/login" method="post">
  <input type="hidden" id="hiddenUsername" name="username"/>
  <input type="hidden" id="hiddenPassword" name="password"/>
  <input type="submit" value="Login"/>
</form>

<script type="text/javascript" language="JavaScript">
  $("#theForm").submit(function() {
    $("#hiddenUsername").val($("#username").val());
    $("#hiddenPassword").val($("#password").val());
  });
  $("#username,#password").keypress(function(e) {
    if (e.which == 13) {
      $("#theForm").submit();
    }
  });
</script>

1
那看起来是个不错的解决方案。因为您发送的表单本身并不包括密码,所以这很合理。我认为为了确保在所有浏览器中都能看到用户名和密码,可以使用两个表单,第一个仅用于此目的。 - Alexis Wilke
3
我喜欢你的解决方案并在我的网站上实现了类似的方法,今天的浏览器仍然没有提供简单的解决方法,这太可笑了。 - AgelessEssence
这在我的Chrome浏览器中一直工作得很好,但最近又开始提示保存密码了。 - manoj
用业余级别的代码突破安全特性是一个可怕的解决方案。 - Free Consulting
1
我刚在Chrome,Opera和Internet Explorer上尝试了这种方法,它似乎是有效的,但不幸的是在Firefox上不起作用。 - chenks
显示剩余3条评论

31

这是一个很旧的帖子,但我仍然会提供我们团队长期努力实现的解决方案。我们在表单中添加了一个新的input type="password"字段,并将其包装在div中并将该div隐藏起来。确保这个div在实际密码输入框之前。 这对我们有用,而且它不会出现任何"保存密码"选项。

Plunk - http://plnkr.co/edit/xmBR31NQMUgUhYHBiZSg?p=preview

HTML:

<form method="post" action="yoururl">
      <div class="hidden">
        <input type="password"/>
      </div>
      <input type="text" name="username" placeholder="username"/>
      <input type="password" name="password" placeholder="password"/>
    </form>

CSS:

.hidden {display:none;}

1
这种方法与使用隐藏输入的方法相比的一个优点是,密码永远不会存储在明文字段中。 - pvgoddijn
@whyAto8 在Chrome 47.0.2526.111中这对我没用...让它起作用的诀窍是在隐藏的div中添加另一个字段文本。浏览器会要求保存密码,但它会说“确定保存这些凭据吗?”然后显示一个空白用户名和一个空白密码。这已经起作用了。 - David Bélanger
1
whyAto8的解决方案连同@David Bélanger的评论对我起了作用(其他解决方案都没有)。我还应该提到,在实际用于数据输入之前,我添加了两个空白隐藏字段,并且重复的(隐藏)字段具有相同的名称。这样,Chrome(48.0.2564.103)甚至不会询问是否保存任何密码。 - Vadim
没有一种方法在Chrome 48.0.2564.116上运行。即使与DavidBelanger的评论结合使用,Chrome弹出窗口仍会在您单击“确定”时缓存密码。 - ChrisO
1
不,它不支持Chrome 94.0.4606.71。 - StvnSpnz
显示剩余3条评论

17
您可以通过在每次展示时随机化密码字段的名称来防止浏览器将表单匹配起来。然后,浏览器会在同一URL下看到密码,但不能确定它是相同的密码。也许它正在控制其他内容。
更新:请注意,这应该是使用自动完成或其他策略的补充,而不是取代它们,原因如其他人所指出的那样。
还要注意,这只会防止浏览器自动完成密码。它无法防止浏览器在任意安全级别中存储密码。

5
@Joel 那可能会阻止表单自动填充,但这是否会防止浏览器要求保存密码给这个“假定”的新表单呢? - Joseph Pecoraro
3
我不相信现在这个方法会起作用。在Firefox13中,我有一个表单,里面有几个不同名称的密码字段。一旦Firefox保存了该页面的密码,它就将保存的密码放入所有密码字段中,不管字段名称是什么(例如,我有“new_password”和“old_password”,保存的密码会被放入这两个字段中)。在这个特定的表单中,我没有用户名可以保存密码 - 只有两个密码字段,如果这有区别的话。 - Jason
1
点头示意 @Jason,每次为密码字段赋予一个新的UUID名称并不能阻止浏览器自动填充。 - F. P. Freely

14

最干净的方式是使用autocomplete="off"标签属性,但是当你使用Tab键切换字段时,Firefox并不完全遵守它。

唯一的解决方法是添加一个假的隐藏密码字段,以欺骗浏览器将密码填充到那里。

<input type="text" id="username" name="username"/>
<input type="password" id="prevent_autofill" autocomplete="off" style="display:none" tabindex="-1" />
<input type="password" id="password" autocomplete="off" name="password"/>

这是一种不好的hack,因为你改变了浏览器的行为,这应该被认为是不良实践。只有在真正需要时才使用它。

注意:这将有效地停止密码自动填充,因为Firefox将“保存”#prevent_autofill的值(为空)并尝试填充任何已保存的密码,因为它总是在找到相应的“用户名”输入后,在DOM中使用第一个type="password"输入。


防止浏览器自动填充密码但允许存储密码有什么意义呢?这只会欺骗用户认为他们的密码没有被存储,而实际上他们是脆弱的。 - CodesInChaos
这样它实际上不会存储您的密码,因为您输入到另一个被FF忽略的框中。相反,它将存储一个空字符串。 - venimus
@CodesInChaos 我个人认为你应该重新考虑你的反对票,因为你的担忧是无效的。 - venimus

13

使用真正的两步验证,避免仅依赖密码,因为密码可能存储在比用户的浏览器缓存更多的地方。


2
顺便说一句,这是身份验证而不是认证。 - Jonathan.
26
@Jonathan Pity,我更喜欢认证(authentification) - Ian Boyd
另一个解决方案可能是实现一个JavaScript,一旦用户退出应用程序,它就会强制关闭浏览器。这将清除浏览器的完整内存,因此无法从浏览器的内存中检索任何数据。 - Ajay Takur

12

经过测试,在所有主要浏览器中,将autocomplete="off"添加到表单标签中是有效的。事实上,到目前为止,美国大多数人都在使用IE8。

  1. IE8、IE9、IE10、Firefox和Safari都可以正常工作。

    浏览器不会询问“保存密码”,之前保存的用户名和密码也不会填充。

  2. Chrome和IE 11不支持autocomplete="off"特性。
  3. FF支持autocomplete="off",但有时现有保存的凭据会被填充。

更新于2014年6月11日

最终,以下是一个跨浏览器的解决方案,使用JavaScript编写,可以在所有浏览器中正常工作。

需要从登录表单中删除“form”标签。客户端验证后,将凭据放入隐藏表单中并提交。

还需添加两个方法,一个用于验证“validateLogin()”,另一个用于监听在文本框/密码/按钮中单击Enter时的事件“checkAndSubmit()”。因为现在登录表单没有表单标签,所以Enter事件在这里无效。

HTML

<form id="HiddenLoginForm" action="" method="post">
<input type="hidden" name="username" id="hidden_username" />
<input type="hidden" name="password" id="hidden_password" />
</form>

Username: <input type="text" name="username" id="username" onKeyPress="return checkAndSubmit(event);" /> 
Password: <input type="text" name="password" id="password" onKeyPress="return checkAndSubmit(event);" /> 
<input type="button" value="submit" onClick="return validateAndLogin();" onKeyPress="return checkAndSubmit(event);" /> 

Javascript

//For validation- you can modify as you like
function validateAndLogin(){
  var username = document.getElementById("username");
  var password = document.getElementById("password");

  if(username  && username.value == ''){
    alert("Please enter username!");
    return false;
  }

  if(password && password.value == ''){
    alert("Please enter password!");
    return false;
  }

  document.getElementById("hidden_username").value = username.value;
  document.getElementById("hidden_password").value = password.value;
  document.getElementById("HiddenLoginForm").submit();
}

//For enter event
function checkAndSubmit(e) {
 if (e.keyCode == 13) {
   validateAndLogin();
 }
}

祝你好运!!!


尽管这个答案提供了有用的信息,但它并没有真正回答如何阻止浏览器保存密码的问题。 - JW Lim
@JW Lim,我已经更新了答案,请查看。谢谢! - Asik
@Sivakumar,请包括操作系统和Safari版本,以便其他人了解情况。在我的系统中(Windows 8,Safari 5)可以正常工作。 - Asik
@Asik Safari 8.0.3和Mac OS 10.10 - Sivakumar

8

实际上不行 - 你唯一能做的是在网站上提供建议;也许,在用户首次登录之前,你可以向他们展示一个表单,其中包含信息,表示不建议使用浏览器存储密码。

然后用户会立即遵循建议,将密码写在便签纸上,并将其贴在显示器上。


11
请记住,这是一个政府网站,因此这些事情都具有政治色彩。如果高层人员说“它不能这样工作”,那么现实情况并不是问题的一部分。问题可能会被转移到便笺上,但处理这些便笺的政策由另一个部门处理 - 问题已经被移交了;-) 我的话很认真。 - Jason

6

我一直在做的是将autocomplete =“off”和使用javascript / jQuery清除密码字段相结合。

jQuery示例:

$(function() { 
    $('#PasswordEdit').attr("autocomplete", "off");
    setTimeout('$("#PasswordEdit").val("");', 50); 
});

通过使用setTimeout(),您可以等待浏览器在清除字段之前完成自动填充操作,否则浏览器将在您清除字段后始终自动填充。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接