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

464

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

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

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

感谢任何帮助。


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

1

我尝试了上面的autocomplete="off",但没有成功。如果您正在使用Angular JS,我建议使用按钮和ng-click。

<button type="button" class="" ng-click="vm.login()" />

这个问题已经有一个被接受的答案,我添加这个答案是为了如果有人不能通过被接受的答案解决问题,他可以使用我的机制。
感谢提问和回答。

这显然会破坏通过按下“回车”键来提交表单的功能。 - 8eecf0d2

0

由于大多数自动完成建议(包括被接受的答案)在当今的Web浏览器中不起作用(即Web浏览器密码管理器忽略自动完成),因此更为新颖的解决方案是在纯文本字段和密码字段之间切换密码和文本类型,并在字段为纯文本字段时使背景颜色匹配文本颜色,这样可以继续隐藏密码,同时在用户(或像KeePass这样的程序)输入密码时成为真正的密码字段。浏览器不会要求保存存储在纯文本字段中的密码。

这种方法的优点是它允许渐进式增强,因此不需要Javascript才能使字段像正常的密码字段一样工作(您也可以从纯文本字段开始,然后应用相同的方法,但那并不是真正符合HIPAA PHI / PII标准)。此外,这种方法也不依赖于可能不会发送到服务器的隐藏表单/字段(因为它们是隐藏的),其中一些技巧在一些现代浏览器中也不起作用。

jQuery插件:

https://github.com/cubiclesoft/php-flexforms-modules/blob/master/password-manager/jquery.stoppasswordmanager.js

以上链接中的相关源代码:

(function($) {
$.fn.StopPasswordManager = function() {
    return this.each(function() {
        var $this = $(this);

        $this.addClass('no-print');
        $this.attr('data-background-color', $this.css('background-color'));
        $this.css('background-color', $this.css('color'));
        $this.attr('type', 'text');
        $this.attr('autocomplete', 'off');

        $this.focus(function() {
            $this.attr('type', 'password');
            $this.css('background-color', $this.attr('data-background-color'));
        });

        $this.blur(function() {
            $this.css('background-color', $this.css('color'));
            $this.attr('type', 'text');
            $this[0].selectionStart = $this[0].selectionEnd;
        });

        $this.on('keydown', function(e) {
            if (e.keyCode == 13)
            {
                $this.css('background-color', $this.css('color'));
                $this.attr('type', 'text');
                $this[0].selectionStart = $this[0].selectionEnd;
            }
        });
    });
}
}(jQuery));

演示:

https://barebonescms.com/demos/admin_pack/admin.php

在菜单中点击“添加条目”,然后滚动到页面底部找到“模块:停止密码管理器”。

免责声明:虽然这种方法适用于视觉障碍者,但屏幕阅读器软件可能会出现问题。例如,屏幕阅读器可能会大声读出用户的密码,因为它看到了一个明文字段。使用上述插件还可能存在其他不可预见的后果。更改内置网页浏览器功能应该谨慎进行,并测试各种条件和边缘情况。


0

面对相同的HIPAA问题,找到了一个相对简单的解决方案,

  1. 创建一个名为数组的隐藏密码字段。

    <input type="password" name="password[]" style="display:none" />
    
  2. 使用相同的数组用于实际的密码字段。

    <input type="password" name="password[]" />
    
浏览器(Chrome)可能会提示您“保存密码”,但无论用户选择保存与否,下次登录时密码都将自动填充隐藏的密码字段,即数组中的零槽位,留下第一个槽位空白。
我尝试定义数组,例如“password [part2]”,但它仍然记住。我认为如果是未索引的数组,它会受到影响,因为它别无选择,只能将其放在第一位置。
然后,您可以使用您选择的编程语言来访问该数组,例如PHP.
echo $_POST['password'][1];

1
通过这种方式,您正在隐藏一个安全问题 - 密码的哈希仍然存储在浏览器缓存中。 - Alexander Burakevych
1
请问您能否澄清一下?密码将会以明文形式通过POST发送。据我所知,POST请求是无法被缓存的。您是在说有其他方法可以发送数据而不使用POST吗?还是您是在说密码被存储在浏览器中?因为它并没有存储密码,而是在数组开头存储了空值,您测试过这种方法吗? - Mike

0
<input type="text" id="mPassword" required="required" title="Valid password required" autocomplete="off" list="autocompleteOff" readonly onfocus="this.removeAttribute('readonly');" style="text-security:disc; -webkit-text-security:disc;" oncopy="return false;" onpaste="return false;"/>

0

我知道的一种方法是使用(例如)JavaScript在提交表单之前将密码字段的值复制出来。

这种方法的主要问题是解决方案与JavaScript绑定。

不过,如果可以绑定到JavaScript,您也可以在向服务器发送请求之前在客户端对密码进行哈希处理。


在客户端进行哈希处理不能替代在服务器端进行哈希处理。如果额外进行客户端哈希处理,我不确定它是否有任何帮助。 - Brilliand
2
在客户端允许哈希处理是危险的,因为这意味着攻击者无需从哈希中破解密码,就可以使用哈希登录。哈希变成了等效于密码。 - rjmunro
我同意Brilliand的看法:只有在在将密码保存到数据库之前,客户端上的哈希才有用。然而,在客户端上使用哈希可以解决一定程度上的中间人攻击问题。话虽如此,由于代码将对黑客(至少是公共网站的黑客)可见,因此它可能并不像看起来那么有用。 - Alexis Wilke

0
对于仍在寻找解决禁用保存密码问题的人来说...
这段代码对我来说在2023年10月24日的Chrome、Firefox和Opera上都有效。
<script type="text/javascript">
   jQuery(document).ready(function($) {
     document.getElementById( "user_login" ).autocomplete = "off";
     document.getElementById( "user_pass" ).autocomplete = "off";
     document.getElementById('#createuser').attr('autocomplete', 'off');
} );
</script>

-1
如果您不想依赖自动填充标志的话,可以通过使用onchange事件确保用户在文本框中输入内容。下面的代码是一个简单的HTML表单。隐藏的表单元素password_edited的初始值设置为0。当密码的值发生变化时,顶部的JavaScript代码(pw_edited函数)将该值更改为1。当按钮被按下时,在提交表单之前会检查该值。这样,即使浏览器忽略您并自动填充字段,用户也无法绕过登录页面而不输入密码。此外,请确保在设置焦点时清空密码字段。否则,您可以在末尾添加一个字符,然后返回并删除它以欺骗系统。我建议除此之外还将autocomplete="off"添加到密码字段,但此示例展示了备用代码的工作原理。
<html>
  <head>
    <script>
      function pw_edited() {
        document.this_form.password_edited.value = 1;
      }
      function pw_blank() {
        document.this_form.password.value = "";
      }
      function submitf() {
        if(document.this_form.password_edited.value < 1) {
          alert("Please Enter Your Password!");
        }
        else {
         document.this_form.submit();
        }
      }
    </script>
  </head>
  <body>
    <form name="this_form" method="post" action="../../cgi-bin/yourscript.cgi?login">
      <div style="padding-left:25px;">
        <p>
          <label>User:</label>
          <input name="user_name" type="text" class="input" value="" size="30" maxlength="60">
        </p>
        <p>
          <label>Password:</label>
          <input name="password" type="password" class="input" size="20" value="" maxlength="50" onfocus="pw_blank();" onchange="pw_edited();">
        </p>
        <p>
          <span id="error_msg"></span>
        </p>
        <p>
          <input type="hidden" name="password_edited" value="0">
          <input name="submitform" type="button" class="button" value="Login" onclick="return submitf();">
        </p>
      </div>
    </form>
  </body>
</html>

-1

autocomplete="off" 在 Firefox 31 中无法禁用密码管理器,很可能在一些早期版本中也不行。

请查看 Mozilla 上关于此问题的讨论: https://bugzilla.mozilla.org/show_bug.cgi?id=956906

我们想使用第二个密码字段输入令牌生成的一次性密码。现在我们改用文本输入而不是密码输入。 :-(


-1
有没有一种方法让网站告诉浏览器不要提供记住密码的选项?
通过使用,网站告诉浏览器这是一个密码。因此,如果您必须从网站角度进行此操作,则必须更改该设置。(显然我不建议这样做)。
最好的解决方案是让用户配置他们的浏览器,以便它不会记住密码。

3
为什么你不建议更改输入类型字段是显而易见的?详细说明安全问题会很有帮助。 - Karl
1
@karl:因为在公开场合输入密码容易被“肩窥”,即在输入密码时通过观察屏幕来获取密码。 - David Schmitt
不仅仅是人类的肩膀冲浪,间谍软件或病毒也可以监视您的屏幕,并查看明文字段中输入的内容。 - Karl
6
如果你的电脑被感染了间谍软件/病毒,那么无论有多少个星号保护也无法拯救你。安装的应用程序拦截“密码”字段输入的内容,和拦截纯文本字段的内容一样简单。 - Markus Olsson
3
此外,如果浏览器看到的是普通文本输入框而不是密码输入框,它很可能会将密码储存在“表单自动填充”数据库中而非密码数据库中...然后在某些无关的网站上提供甚至自动填充该密码!因此你实际上比之前更加糟糕。 - zwol
那么,如果你必须从网站的角度来做这件事,那么你就必须改变它。但是怎么改呢? - user5260143

-1

我被分配了一个类似的任务,即禁用浏览器自动填充登录名和密码,在经过多次尝试后,我发现以下解决方案是最优的。只需在您的原始控件之前添加以下控件即可。

<input type="text" style="display:none">
<input type="text" name="OriginalLoginTextBox">

<input type="password" style="display:none">
<input type="text" name="OriginalPasswordTextBox">

这在IE11和Chrome 44.0.2403.107上运行良好。


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