ChatGPT解决这个技术问题 Extra ChatGPT

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

为政府医疗保健机构工作的乐趣之一是必须处理有关处理 PHI(受保护的健康信息)的所有偏执。不要误会我的意思,我完全赞成尽一切可能保护人们的个人信息(健康、财务、上网习惯等),但有时人们会有点过于紧张。

恰当的例子:我们的一位州客户最近发现浏览器提供了方便的功能来保存您的密码。我们都知道它已经存在了一段时间并且是完全可选的,由最终用户决定是否使用它是一个明智的决定。但是,目前有一些骚动,我们被要求找到一种方法来禁用我们网站的该功能。

问题:网站有没有办法告诉浏览器不要提供记住密码的功能?我从事 Web 开发已经有很长时间了,但不知道我以前遇到过这种情况。

任何帮助表示赞赏。

您应该提供一个greasemonkey-script,以便人们可以重新启用它。我不认为用户喜欢每次都被迫输入密码......
这个问题值得一票,因为它有用且清晰。另一方面,我不希望人们找到解决这个“问题”的方法。
这并不总是一个“问题”。我来到这里是因为 Firefox 提示为包含 WiFi/SSID 密码的表单保存密码,而不是登录用户名/密码表单。这很烦人,我想停止它。
如果信息如此重要,则不应仅受密码保护。
您应该通过正确设置 autocomplete= 标签来鼓励使用密码管理器。这就是提高安全性的方法。

d
double-beep

我不确定它是否适用于所有浏览器,但您应该尝试在表单上设置 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,则 userbase 或零)仍将保存他们的密码。

jQuery 示例:

$('#loginForm').attr('autocomplete', 'off');

快速评论一下,由于这种情况正在发生变化,HTML5 将 autocomplete 属性添加到规范中,因此它现在有效。
仅供参考,Microsoft 决定 Internet Explorer 11 将不再支持 input type="password" 字段的 autocomplete="off"msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx
正如@JWLim 提到 IE 11 不再支持禁用密码保存功能一样,Firefox 也是如此。 bugzilla.mozilla.org/show_bug.cgi?id=956906
Firefox(不幸的是)跟随微软的脚步,也“删除”了自动完成支持。有关详细信息,请参阅以下问题讨论中的评论 100:bugzilla.mozilla.org/show_bug.cgi?id=956906
现在,不适用于 Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
M
Murat Yıldız

此外

autocomplete="off"

利用

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

对于您不希望他们记住表单数据的输入(usernamepassword 等),如下所示:

<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 等)上进行了测试,效果非常好。希望这可以帮助。


@Murat Yıldız:我必须实现相同的功能,并且我遵循了您的代码。它在所有浏览器中对我来说都很好。谢谢 !
@Sree 我很高兴它对你有帮助:)
刚刚测试了 Mozilla Firefox 52.0、Google Chrome 57.0、Microsoft Edge 38.1,运行起来就像一个魅力!..
Safari mobile 中可能存在错误,因为此答案正在修复它stackoverflow.com/questions/2530/…
Windows Firefox 57.0.2(64 位)在我实现后仍然建议保存密码。
I
Ian Boyd

我一直在为这个问题苦苦挣扎,这个问题有一个独特的转折点。特权用户无法使用保存的密码,但普通用户需要它。这意味着特权用户必须登录两次,第二次强制执行不保存密码。

有了这个要求,标准的 autocomplete="off" 方法并不适用于所有浏览器,因为密码可能是在第一次登录时保存的。一位同事找到了一个解决方案,将焦点放在新密码字段上时替换密码字段,然后将焦点放在新密码字段上(然后挂钩相同的事件处理程序)。这有效(除了它在 IE6 中导致了无限循环)。也许有办法解决这个问题,但这导致我偏头痛。

最后,我尝试在表单之外使用用户名和密码。令我惊讶的是,这奏效了!它适用于 IE6,以及 Linux 上当前版本的 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>

这看起来是一个很好的解决方案。这是有道理的,因为您发送的表单本身并不包含密码。我想确保你可以有两种形式,第一种只是为了确保用户名和密码在所有浏览器中都是可见的。
我喜欢您的解决方案并在我的网站上实现了类似的解决方案,这很荒谬,如今浏览器不提供解决此问题的简单方法。
不知道是不是因为我被 jquery 1.6 卡住了,但是上面的 jquery 只在包装 $(document).ready(function(){ }); 之后才起作用。
唯一正确的想法是,因为某些浏览器不再接受 autocomplete="off" !
我刚刚在 chrome、opera 和 internet explorer 上尝试过这种方法,它似乎有效,但不幸的是它不适用于 Firefox
w
whyAto8

好吧,这是一个非常古老的帖子,但我仍然会给出我的解决方案,这是我的团队长期以来一直在努力实现的。我们刚刚在表单中添加了一个新的 input type="password" 字段并将其包装在 div 中并隐藏了 div。确保这个 div 在实际密码输入之前。这对我们有用,但没有提供任何保存密码选项

砰砰 - 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;}

与使用隐藏输入的方法相比,这种方式的一个优点是密码永远不会存储在明文字段中
@whyAto8 这在 Chrome 47.0.2526.111 中对我不起作用……让它起作用的诀窍是在隐藏的 div 中添加另一个字段文本。浏览器要求保存密码,但显示“您确定要保存此凭据吗?”然后它显示一个空白用户名和一个空白密码。这已经奏效了。
为什么Ato8 的解决方案以及@David Bélanger 的评论对我有用(其他解决方案都没有)。我还应该提到,我在实际用于数据输入的字段之前添加了两个空白隐藏字段,并且重复(隐藏)字段具有相同的各自名称。这样 Chrome (48.0.2564.103) 甚至没有询问是否应该保存任何密码。
Chrome 48.0.2564.116 上没有这些组合。即使结合 DavidBelanger 的评论,如果您单击确定,要求您保存密码的 Chrome 弹出窗口仍会缓存密码
很好的答案.. 请你告诉我你为什么说“确保这个 div 在实际密码输入之前”?我把那个 div 放在那个实际的密码输入之后,它仍然可以工作。那么你为什么提到这个呢?
J
Joel Coehoorn

您可以通过随机化用于每个节目的密码字段的名称来防止浏览器匹配表单。然后浏览器会看到与 url 相同的密码,但不能确定它是相同的密码。也许它正在控制其他东西。

更新:请注意,由于其他人指出的原因,这应该是使用自动完成或其他策略的补充,而不是替代它们。

另请注意,这只会阻止浏览器自动完成密码。它不会阻止它以浏览器选择使用的任意安全级别存储密码。


[@Joel](#32409) 可能会阻止表单自动填充,但会阻止浏览器要求保存此假定新表单的密码吗?
我不相信现在这会奏效。在 FF 13 中,我有一个包含多个密码字段的表单,它们都具有不同的名称。 FF 一旦保存了该页面的密码,就会将保存的密码粘贴到所有密码字段中。它不关心字段的名称是什么(例如,我有“new_password”和“old_password”,保存的密码会被转储到这两个字段中)。在这种特殊形式中,我没有用于保存密码的用户名 - 只有两个密码字段,以防万一。
点头@Jason,每次为密码字段提供一个新的 UUID 名称并没有阻止浏览器尝试填写它。
D
David Schmitt

使用真正的 two-factor authentication 来避免对密码的唯一依赖,密码可能存储在比用户浏览器缓存更多的地方。


顺便说一句,这是身份验证而不是身份验证
@Jonathan Pity,我更喜欢身份验证
另一种解决方案可能是实现 JavaScript,一旦用户退出应用程序,它就会强制关闭浏览器。这将刷新浏览器的完整内存,因此无法从浏览器的内存中检索数据。
v
venimus

最干净的方法是使用 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"/>

这是一个丑陋的黑客,因为你改变了浏览器的行为,这应该被认为是不好的做法。仅在您确实需要时才使用它。

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


阻止浏览器填写密码但允许它存储密码有什么意义?它只会诱使用户认为他们的密码没有被存储,而他们实际上很容易受到攻击。
这样,它实际上不会存储您的密码,因为您在另一个框中键入,FF 会忽略该框。相反,它将存储一个空字符串。
@CodesInChaos 恕我直言,您应该重新考虑您的否决票,因为您的担忧无效
A
Alastair Maw

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

IE8、IE9、IE10、Firefox、Safari 运行良好。浏览器不询问“保存密码”。此外,未填充以前保存的用户名和密码。 Chrome 和 IE 11 不支持 autocomplete="off" 功能 FF 支持 autocomplete="off"。但有时会填充现有的已保存凭据。

更新于 2014 年 6 月 11 日

最后,下面是一个使用 javascript 的跨浏览器解决方案,它在所有浏览器中都可以正常工作。

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

另外,添加两个方法。一个用于验证“validateLogin()”,另一个用于在文本框/密码/按钮“checkAndSubmit()”中单击输入时侦听输入事件。因为现在登录表单没有表单标签,所以输入事件在这里不起作用。

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,我已经更新了答案。请调查一下。谢谢!
@Sivakumar,好的,请包括 Safari 的操作系统和版本。让其他人也知道。它在我的系统中工作(Windows 8,Safary 5)
@Asik Safari 8.0.3 和 Mac OS 10.10
J
Jason Bunting

不是真的——你唯一能做的就是在网站上提供建议;也许,在他们第一次登录之前,您可以向他们展示一个表格,其中包含表明不建议他们允许浏览器存储密码的信息。

然后用户将立即听从建议,在便利贴上写下密码并将其粘贴到他们的显示器上。


你必须记住这是一个政府网站,这样的事情是带有政治色彩的。如果高层说“它不能这样工作”,那么现实就不是等式的一部分。问题可能会转移到便利贴上,但这些政策是由不同的部门来处理的——问题已经转移到了;-) 我实际上是认真的。
M
Már Örlygsson

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

jQuery 示例:

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

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


N
Nikhil Dinesh

如果 autocomplete="off" 不起作用...删除表单标记并改用 div 标记,然后使用 jquery 将表单值传递给服务器。这对我有用。


m
mfernandes

因为 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 位)在我实现后仍然建议保存密码。
T
Thrawn

就像人们意识到的那样——“自动完成”属性在大多数情况下都有效,但高级用户可以使用小书签绕过它。

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


“但高级用户可以绕过它” - 这适用于大多数应用程序功能,无论是否是网络,不应成为限制系统的理由。人们还可以在便利贴上写下他们的密码并将其放在他们的显示器上,从应用程序的角度来看,您只能为安全做很多事情,并且提供有意义的默认行为(不保存在本地)是一个开始。
D
Dai Bok

我有一个解决方法,这可能会有所帮助。

您可以进行自定义字体破解。因此,制作一个自定义字体,例如所有字符为点/圆/星。将此用作您网站的自定义字体。检查如何在 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 字体没有损坏。希望能帮助到你?


非常巧妙的解决方案有一个密码字体here
如果您使用这样的解决方案,您需要考虑到用户可以自由复制输入到这个相似密码字段中的文本。复制和剪切功能在真实密码字段中被禁用。
k
knee-cola

解决这个问题最简单的方法是将INPUT字段放在FORM标签外,并在FORM标签内添加两个隐藏字段。然后在表单数据提交到服务器之前的提交事件侦听器中,将可见输入的值复制到不可见的值。

这是一个示例(您不能在此处运行它,因为表单操作未设置为真正的登录脚本):

登录和保存密码测试


Windows Firefox 57.0.2(64 位)在我实现后仍然建议保存密码。
好吧,这只是一个 hack,它可能随时停止工作:)
这是最好的选择!只需在提交前清除密码字段:$('.password').val('')
o
ovalek

我的 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 位)上测试。


这实际上有效。这可以防止浏览器保存密码。为了防止显示密码,您可以将输入字段包装在隐藏的 div 中。如果 DOM 已加载,您已经可以执行此操作,无需等到您提交表单。
适用于 IE 11.0.9600.18161 !
那是真实的。现在我在 FF 44.0.2 中尝试了这个,这个 hack 不再起作用了......真可惜。在 Chrome 中这仍然有效。
您可以将 input[type=submit] 或 button[type=submit] 替换为常规 button[type=button] 并在 onclick 处理程序中执行此操作。如果表单中不存在 [type=submit],它还会阻止使用 enter 键提交表单,并且不会显示保存密码提示。
C
Cedric Simon

我测试了很多解决方案。动态密码字段名称,多个密码字段(假的不可见),将输入类型从“文本”更改为“密码”,自动完成=“关闭”,自动完成=“新密码”,...但最近没有解决它浏览器。

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

它不如本机密码字段“安全”,因为选择键入的文本会将其显示为明文,但不会记住密码。它还取决于激活 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
2 revs

这是我的解决方案的 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"/>

J
Joseph Pecoraro

马库斯提出了一个很好的观点。我决定查找 autocomplete 属性并得到以下信息:

使用此属性的唯一缺点是它不是标准的(它适用于 IE 和 Mozilla 浏览器),并且会导致 XHTML 验证失败。我认为这是一个打破验证是合理的情况。 (资源)

所以我不得不说,虽然它不能 100% 全面工作,但它是在主要浏览器中处理的,所以它是一个很好的解决方案。


我遇到了按照 w3c 标准进行验证的问题。问题是我想要一个移动银行网站的这个功能。我假设移动浏览器足够严格,如果使用了一些无效属性,有时可能会弄乱表单。在这种情况下你有什么建议?
我认为这是一种古老的思维方式。许多最近的移动浏览器都是基于 WebKit 构建的,它们要么支持要么优雅地忽略此属性。我不知道其他国家或旧手机中的浏览器如何处理这个问题,但优雅地处理未知的属性/元素是一个好的浏览器的基础。它“未来证明”浏览器不会随着网络的发展而崩溃。它可能会落后(不实施新功能),但不会中断。希望有帮助=)
它应该是对所引用答案的评论,而不是对问题本身的答案。
r
ruruskyi

真正的问题远不止在 HTML 中添加属性——这是常见的安全问题,这就是为什么人们发明了硬件密钥和其他疯狂的安全措施。

想象一下,您的 autocomplete="off" 在所有浏览器中都能完美运行。这对安全有帮助吗?当然不。用户将在教科书上、贴在显示器上的贴纸上写下他们的密码,每个办公室访问者都可以看到它们,并将它们保存到桌面上的文本文件中等等。

通常,Web 应用程序和 Web 开发人员不以任何方式对最终用户的安全负责。最终用户只能保护自己。理想情况下,他们必须将所有密码牢记在心,并使用密码重置功能(或联系管理员)以防忘记。否则,总会有密码被看到和以某种方式被盗的风险。

因此,要么您对硬件密钥有一些疯狂的安全策略(例如,一些银行提供基本上采用双因素身份验证的网上银行服务),要么基本上没有安全性。好吧,这当然有点过分夸大了。了解您要防范的内容很重要:

未授权访问。最简单的登录表单基本上就足够了。有时会采取其他措施,例如随机安全问题、验证码、密码强化等。凭据嗅探。如果人们从公共 Wi-Fi 热点等访问您的 Web 应用程序,HTTPS 是必须的。提到即使有 HTTPS,您的用户也需要定期更改密码。内线攻击。有两个这样的例子,从简单地从浏览器窃取密码或你在桌子上某处写下的密码(不需要任何 IT 技能)开始,到会话伪造和拦截本地网络流量(甚至加密)结束并进一步访问 Web 应用程序,就像它是另一个最终用户一样。

在这篇特定的帖子中,我可以看到对开发人员提出的不充分的要求,由于问题的性质——最终用户安全,他永远无法解决。我的主观观点是,老实说,开发人员基本上应该说“不”并指出需求问题,而不是在这些任务上浪费时间。这并不能绝对让您的系统更安全,而是会导致显示器上贴有贴纸的情况。不幸的是,有些老板只听到他们想听到的。但是,如果我是您,我会尝试解释实际问题的出处,并且 autocomplete="off" 不会解决它,除非它会迫使用户将所有密码完全保留在他们的脑海中!开发者本身不能完全保护用户,用户需要知道如何使用系统,同时不暴露他们的敏感/安全信息,这远远超出了身份验证。


L
Lasitha Benaragama

我在 autocomplete="off" 上尝试过,但一切都成功了。如果您使用的是 Angular js,我的建议是使用按钮和 ng-click。

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

如果有人不能用接受的答案解决问题,他可以使用我的机制,这已经有一个可接受的答案。

感谢您的问题和答案。


这显然会破坏按 enterreturn 键提交表单。
H
Huppie

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

这样做的主要问题是该解决方案与 JavaScript 相关联。

再说一次,如果它可以绑定到 JavaScript,那么您最好在向服务器发送请求之前在客户端对密码进行哈希处理。


客户端的散列不能替代服务器端的散列。我不确定这是否有任何帮助(如果另外做了)。
在客户端允许散列是危险的,因为这意味着攻击者不需要从散列中破解密码,他们可以使用散列登录。散列变成密码等效的。
我同意 Billiand 的观点,即只有在将密码保存在数据库中之前,服务器上也有哈希值时,客户端上的哈希值才有用。然而,在客户端有一个散列可以帮助解决中间人的一些问题。话虽如此,由于黑客可以使用该代码(至少在公共站点上),因此它可能并不像看起来那么有用。
M
Mike

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

创建一个隐藏密码字段,字段名称为数组。 对实际密码字段使用相同的数组。

浏览器 (Chrome) 可能会提示您“保存密码”,但无论用户是否选择保存,下次登录密码时都会自动填充隐藏的密码字段,即数组中的零位,第一个位留空。

我尝试定义数组,例如“password[part2]”,但它仍然记得。我认为如果它是一个未索引的数组,它就会把它扔掉,因为它别无选择,只能把它放在第一个位置。

然后您使用您选择的编程语言来访问数组,例如 PHP,

echo $_POST['password'][1];

这样你就隐藏了一个安全问题——密码的哈希仍然存储在浏览器的缓存中。
你能澄清一下吗?密码将使用 POST 以纯文本形式发送。据我所知,不能缓存 POST 请求。您是说使用 POST 发送数据的替代方法吗?或者你是说密码是存储在浏览器中的,因为它存储的不是密码而是数组开头的空值,你测试过这个方法吗?
C
CubicleSoft

由于大多数 autocomplete 建议(包括已接受的答案)在当今的网络浏览器中都不起作用(即网络浏览器密码管理器忽略 autocomplete),一个更新颖的解决方案是在 passwordtext 类型之间交换并在字段为纯文本字段时使背景颜色与文本颜色匹配,当用户(或类似 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

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

免责声明:虽然这种方法适用于视力正常的人,但屏幕阅读器软件可能存在问题。例如,屏幕阅读器可能会大声读出用户的密码,因为它看到的是纯文本字段。使用上述插件可能还会产生其他无法预料的后果。通过测试各种条件和边缘情况,应谨慎更改内置 Web 浏览器功能。


S
Stu
<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;"/>

J
Joseph Pecoraro

网站有没有办法告诉浏览器不要记住密码?

该网站通过使用 <input type="password"> 告诉浏览器这是一个密码。因此,如果您必须从网站的角度这样做,那么您将不得不改变它。 (显然我不推荐这个)。

最好的解决方案是让用户配置他们的浏览器,这样它就不会记住密码。


您不建议更改输入类型字段有多明显?详细说明安全问题会有所帮助。
@karl:因为必须公开输入密码允许“肩冲浪”,即在输入密码时通过查看屏幕来收集密码的过程。
不仅是人类肩部冲浪,间谍软件或病毒也可以监视您的屏幕并查看在纯文本字段中输入的内容。
@karl:如果您的计算机上有间谍软件/病毒,那么任何星号保护都无法拯救您。对于已安装的应用程序来说,拦截输入到“密码”字段中的内容并不比拦截纯文本字段更困难。
此外,如果浏览器看到常规文本输入而不是密码输入,它可能会将密码存储在表单自动完成数据库而不是密码数据库中......然后在一些不相关的网站上建议甚至自动填充它!所以你实际上比刚开始时更糟。
M
Mark

如果您不想信任自动完成标志,您可以确保用户使用 onchange 事件在框中键入。下面的代码是一个简单的 HTML 表单。隐藏的表单元素 password_edited 一开始设置为 0。当密码的值更改时,顶部的 JavaScript(pw_edited 函数)将值更改为 1。当按下按钮时,它会在提交表单之前检查此处的 valueenter 代码.这样,即使浏览器忽略您并自动完成该字段,用户也无法在不输入密码字段的情况下通过登录页面。此外,请确保在设置焦点时将密码字段设为空白。否则,您可以在最后添加一个字符,然后返回并删除它以欺骗系统。我建议另外将 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>

N
Naradana

autocomplete="off" 不适用于禁用 Firefox 31 中的密码管理器,并且很可能在某些早期版本中也不起作用。

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

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


S
Sheiky

我被赋予了类似的任务来禁用浏览器自动填写登录名和密码,经过大量试验和错误后,我发现以下解决方案是最佳的。只需在原始控件之前添加以下控件。

<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


P
Peter Nelson

autocomplete="off" 适用于大多数现代浏览器,但我使用的另一种与 Epiphany(GNOME 的 WebKit 驱动的浏览器)一起成功工作的方法是在会话状态(或隐藏字段,我碰巧有)中存储随机生成的前缀会话状态中的合适变量),并使用它来更改字段的名称。 Epiphany 仍然想保存密码,但是当返回到表单时,它不会填充字段。


这比以通常的方式存储它们更糟糕,因为现在用户看不到密码已保存,同时也无法阻止攻击者从存储中提取密码。