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

464

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

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

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

感谢任何帮助。


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

3
如果autocomplete="off"无效...请删除表单标签并使用div标签,然后使用jquery将表单值传递到服务器。这对我起作用了。

3
由于autocomplete =“off”在密码字段中不起作用,必须依赖javascript。以下是基于此处找到的答案的简单解决方案。
向您的密码字段添加属性data-password-autocomplete ="off":
<input type="password" data-password-autocomplete="off">

请加入以下JS代码:

$(function(){
    $('[data-password-autocomplete="off"]').each(function() {
        $(this).prop('type', 'text');
        $('<input type="password"/>').hide().insertBefore(this);
        $(this).focus(function() {
            $(this).prop('type', 'password');
        });
    });     
});

这个解决方案适用于Chrome和FF浏览器。


Windows Firefox 57.0.2(64位)在我实施此操作后仍建议保存密码。 - Panu Haaramo

2
我有一个解决办法,可能会有所帮助。
您可以创建自定义字体。例如,将所有字符都设置为点/圆圈/星形等。然后将其用作您网站的自定义字体。在inkscape中了解如何执行此操作:how to make your own font 然后,在登录表单上使用以下内容:
<form autocomplete='off'  ...>
   <input type="text" name="email" ...>
   <input type="text" name="password" class="password" autocomplete='off' ...>
   <input type=submit>
</form>

然后添加你的CSS:

@font-face {
    font-family: 'myCustomfont';
    src: url('myCustomfont.eot');
    src: url('myCustomfont?#iefix') format('embedded-opentype'),
         url('myCustomfont.woff') format('woff'),
         url('myCustomfont.ttf') format('truetype'),
         url('myCustomfont.svg#myCustomfont') format('svg');
    font-weight: normal;
    font-style: normal;

}
.password {
  font-family:'myCustomfont';
}

非常跨浏览器兼容。我已经尝试了IE6+,FF,Safari和Chrome。只需确保您转换的OET字体不会损坏即可。希望能有所帮助?


1
这是一个非常棒的解决方案,这里有一个密码字体链接 - andrew
6
如果您使用这样的解决方案,则需要考虑用户可以自由复制输入到类似密码字段中的文本。在真正的密码字段上,复制和剪切功能是被禁用的。 - user246645

2
最简单的解决方法是将INPUT字段放在FORM标记之外,并在FORM标记内添加两个隐藏字段。然后,在提交事件监听器中,在表单数据提交到服务器之前,将可见输入字段的值复制到不可见的字段中。
以下是一个示例(由于表单操作未设置为实际登录脚本,因此您无法在此处运行它):

<!doctype html>
<html>
<head>
  <title>Login & Save password test</title>
  <meta charset="utf-8">
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</head>

  <body>
      <!-- the following fields will show on page, but are not part of the form -->
      <input class="username" type="text" placeholder="Username" />
      <input class="password" type="password" placeholder="Password" />

      <form id="loginForm" action="login.aspx" method="post">
        <!-- thw following two fields are part of the form, but are not visible -->
        <input name="username" id="username" type="hidden" />
        <input name="password" id="password" type="hidden" />
        <!-- standard submit button -->
        <button type="submit">Login</button>
      </form>

    <script>
      // attache a event listener which will get called just before the form data is sent to server
      $('form').submit(function(ev) {
        console.log('xxx');
        // read the value from the visible INPUT and save it to invisible one
        // ... so that it gets sent to the server
        $('#username').val($('.username').val());
        $('#password').val($('.password').val());
      });
    </script>

  </body>
</html>


Windows Firefox 57.0.2(64位)在我实施后仍建议保存密码。 - Panu Haaramo
嗯,这只是一个hack,可能随时会停止工作 :) - knee-cola
这是最好的选择!在提交之前只需清除密码字段:$('.password').val('') - ebelendez

2

为了让人们意识到,'autocomplete' 属性大多数情况下都是有效的,但高级用户可以使用书签工具绕过它。

让浏览器保存密码实际上增加了对键盘记录的保护,因此最安全的选择可能是在浏览器中保存密码,但用主密码来保护它们(至少在 Firefox 中如此)。


2
“但是高级用户可以绕过它” - 这适用于大多数应用程序功能,无论是网络还是非网络应用程序,并且不应成为限制系统的原因。人们也可以将密码写在便条上并放在监视器上,从应用程序角度来看,您只能为安全性做很多事情,并提供有意义的默认行为(不要本地保存),这是一个开始。 - Niels Keurentjes

2

我的js(jquery)解决方法是在表单提交时将密码输入类型更改为文本。密码可能会变得可见一秒钟,因此我也会在此之前隐藏输入。我不想在登录表单中使用此方法,但它在网站管理部分内(与autocomplete =“off”一起)非常有用。

在提交表单之前,请尝试将此代码放入控制台(使用jquery)。

$('form').submit(function(event) {
    $(this).find('input[type=password]').css('visibility', 'hidden').attr('type', 'text');
});

测试于Chrome 44.0.2403.157(64位)。


1
这实际上是有效的。这会防止浏览器保存密码。为了防止显示密码,你可以将输入框包裹在隐藏的div中。如果DOM已加载,你已经可以这样做,无需等到提交表单。 - Ferry Kranenburg
适用于IE 11.0.9600.18161! - Ilya Serbis
没错。现在我在FF 44.0.2中尝试了一下,这个hack不再起作用了……太遗憾了。但在Chrome中仍然有效。 - ovalek
你可以将 input[type=submit] 或 button[type=submit] 替换为普通的 button[type=button],并在 onclick 处理程序中执行此操作。如果表单中没有 [type=submit],它还会防止使用回车键提交表单和显示保存密码提示。 - Steven Don

2

我尝试了很多解决方案。动态密码字段名称、多个密码字段(对于虚假的字段不可见)、将输入类型从“text”更改为“password”、autocomplete="off"、autocomplete="new-password"等等,但在最近的浏览器中都没能解决这个问题。

为了摆脱密码记忆功能,我最终将密码视为输入字段,并“模糊”输入的文本。

与原生密码字段相比,它的安全性较低,因为选择输入的文本会将其显示为明文,但密码不会被记住。它还依赖于激活Javascript。

您需要评估使用以下提案与使用浏览器的密码记忆选项之间的风险。

虽然用户可以管理(禁用每个站点)密码记忆,但对于个人计算机来说,这是可以接受的,而对于“公共”或共享计算机则不行。

在我的情况下,它是针对运行在共享计算机上的ERP,因此我将尝试下面的解决方案。

<input style="background-color: rgb(239, 179, 196); color: black; text-shadow: none;" name="password" size="10" maxlength="30" onfocus="this.value='';this.style.color='black'; this.style.textShadow='none';" onkeypress="this.style.color='transparent'; this.style.textShadow='1px 1px 6px green';" autocomplete="off" type="text">

2
这是我的解决方案的 HTML 代码。它适用于 Chrome、Safari 和 Internet Explorer。我创建了一种新的字体,所有字符看起来都像“●”。然后我将这种字体用于我的密码文本。注意:我的字体名称为“passwordsecretregular”。
<style type="text/css">
         #login_parola {
             font-family: 'passwordsecretregular' !important;
            -webkit-text-security: disc !important;
            font-size: 22px !important;
         }
    </style>


<input type="text" class="w205 has-keyboard-alpha"  name="login_parola" id="login_parola" onkeyup="checkCapsWarning(event)"  
   onfocus="checkCapsWarning(event)" onblur="removeCapsWarning()" onpaste="return false;" maxlength="32"/>

等一下... 你要设置<input>的字体,以便用户无法“看到”密码...那样怎么防止密码保存呢?此外,这会移除<input type="password">字段所有的安全保护措施。这主意真是太糟糕了。 - fbitterlich

1
真正的问题要比仅仅在你的HTML中添加属性更深入 - 这是常见的安全问题,这就是为什么人们发明了硬件密钥和其他疯狂的安全措施。想象一下,你在所有浏览器中完美地运行autocomplete =“off”。这会对安全有帮助吗?当然不会。用户会把他们的密码写在教科书上,在附着在显示器上的贴纸上,每个办公室访客都可以看到,将它们保存到桌面上的文本文件等等。

通常来说,Web应用程序和Web开发人员无论如何都不负责最终用户的安全。最终用户只能自我保护。理想情况下,他们必须记住所有密码,并在忘记密码时使用密码重置功能(或联系管理员)。否则,密码始终存在被窃取的风险。

因此,你要么有一些疯狂的安全策略,例如使用硬件密钥(像某些银行提供的互联网银行业务,基本上采用双重身份验证),要么根本没有安全措施。当然这有点夸张。重要的是要了解你试图保护什么:

  1. 未经授权的访问。基本的登录表单已足够。有时会采取额外措施,如随机安全问题、验证码、密码加固等。
  2. 凭证嗅探。如果人们从公共 Wi-Fi 热点等地方访问您的 Web 应用程序,则必须使用 HTTPS。提醒用户即使使用了 HTTPS,也需要定期更改密码。
  3. 内部攻击。有太多这样的例子,从简单的从浏览器中窃取密码或在桌子上写下密码(不需要任何 IT 技能),到会话伪造和拦截本地网络流量(甚至加密)并进一步访问 Web 应用程序,就像它是另一个终端用户一样。
在这篇文章中,我看到开发人员被要求解决一些由于最终用户安全性质而无法解决的不充分需求。我的主观观点是,开发人员应该基本上说“不”,并指出需求问题,而不是浪费时间在这样的任务上。这并不能绝对地使您的系统更加安全,它只会导致在监视器上贴标签的情况。不幸的是,有些老板只听取他们想要听到的内容。然而,如果我是你,我会尝试解释问题实际来自哪里,并且autocomplete="off"除非强制用户将所有密码都独立地记住,否则不会解决问题!开发人员无法完全保护用户,用户需要知道如何使用系统,并且同时不暴露他们的敏感/安全信息,这远远超出了身份验证的范围。

1

Markus提出了一个很好的观点。我决定查找autocomplete属性,并得到以下结果:

使用此属性唯一的缺点是它不是标准的(它在IE和Mozilla浏览器中有效),并且会导致XHTML验证失败。但我认为这是一种合理的情况,可以打破验证。(source)

因此,虽然它不能在所有浏览器上百分之百地工作,但在主要浏览器中处理得很好,所以它是一个很好的解决方案。


我遇到了一个问题,需要按照W3C标准进行验证。问题是,我想要在移动银行网站上实现此功能。我假设移动浏览器非常严格,如果使用了一些无效的属性,可能会导致表单出现问题。在这种情况下,您有什么建议? - asgs
2
我认为这是一种老式的思维方式。许多最近的移动浏览器都是基于WebKit构建的,它们支持或优雅地忽略此属性。我不知道其他国家或旧手机中的浏览器如何处理此问题,但优雅地处理未知的属性/元素对于一个好的浏览器来说是基本的。它可以“未雨绸缪”,使浏览器在Web发展时不会崩溃。它可能会落后(不实现新功能),但不会崩溃。希望这有所帮助 =) - Joseph Pecoraro
1
这更应该是对所引用答案的评论,而不是对问题本身的答案。 - viam0Zah

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