Disable browser 'Save Password' functionality
为政府医疗保健机构工作的乐趣之一是必须处理与phi(受保护的健康信息)有关的所有偏执。别误会我,我会尽一切可能保护人们的个人信息(健康、财务、冲浪习惯等),但有时人们会有点过于紧张。
举个例子:我们的一个州客户最近发现浏览器提供了方便的功能来保存您的密码。我们都知道它已经存在一段时间了,完全是可选的,由最终用户决定是否使用它是一个明智的决定。然而,现在有一点骚动,我们被要求寻找一种方法来禁用我们站点的功能。
问题:网站有没有办法告诉浏览器不要记住密码?我从事网络开发已经很长时间了,但不知道我以前遇到过这种情况。
感谢您的帮助。
我不确定它是否适用于所有浏览器,但您应该尝试在表单上设置autocomplete="off"。
1 | <form id="loginForm" action="login.cgi" method="post" autocomplete="off"> |
The easiest and simplest way to disable Form and Password storage prompts and prevent form data from being cached in session history is to use the autocomplete form element attribute with value"off".
From http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion
号
一些小的研究表明,这是可行的,但我不会留下任何保证;)
@约瑟夫:如果严格要求使用实际标记通过XHTML验证(但不知道为什么),理论上可以在之后使用javascript添加此属性,但是禁用JS的用户(如果您的站点需要JS,则可能忽略用户基数或零)仍将保存其密码。
jquery示例:
1 | $('#loginForm').attr('autocomplete', 'off'); |
号
我在这个问题上挣扎了一段时间,对这个问题有了一个独特的扭转。特权用户不能让保存的密码为他们工作,但普通用户需要它。这意味着特权用户必须登录两次,第二次强制不保存密码。
有了这个要求,标准的
最后,我尝试将用户名和密码放在表单之外。令我惊讶的是,这起作用了!它适用于IE6,以及Linux上当前版本的火狐和Chrome。我没有进一步测试过它,但我怀疑它在大多数浏览器(如果不是所有浏览器)中都能正常工作(但如果有一个浏览器不关心是否没有表单,我也不会感到惊讶)。
下面是一些示例代码,以及一些jquery以使其正常工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <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(); } }); |
只是使用
readonly onfocus="this.removeAttribute('readonly');"
号
除了
autocomplete="off"
号
到您不想记住表单数据(
1 2 3 4 5 | <input type="text" name="UserName" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');"> <input type="password" name="Password" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');"> |
。
在主要浏览器的最新版本上进行了测试,如
嗯,这是一个非常古老的职位,但我仍然会给出我的解决方案,这是我的团队长期以来一直在努力实现的。我们刚刚在表单中添加了一个新的input type="password"字段,并将其包装在DIV中,使DIV隐藏起来。确保此DIV在实际密码输入之前。这对我们很有用,它没有提供任何保存密码选项
普朗克-http://plnkr.co/edit/xmbr31nqmuguhyhbizsg?P=预览
HTML:
1 2 3 4 5 6 7 | <form method="post" action="yoururl"> <input type="password"/> <input type="text" name="username" placeholder="username"/> <input type="password" name="password" placeholder="password"/> </form> |
CSS:
1 | .hidden {display:none;} |
。
您可以通过随机化每次放映时用于密码字段的名称来阻止浏览器匹配表单。然后浏览器会看到同一个URL的密码,但不能确定它是同一个密码。也许它控制着别的东西。
更新:请注意,这应该是除了使用自动完成或其他策略之外,而不是因为其他人指出的原因而替换它们。
还要注意,这只会阻止浏览器自动完成密码。它不会阻止它以浏览器选择使用的任意安全级别存储密码。
使用真正的双因素身份验证来避免对密码的唯一依赖性,这些密码可能存储在比用户浏览器缓存更多的地方。
最干净的方法是使用
唯一能阻止这种情况的方法是添加一个假的隐藏密码字段,它会欺骗浏览器在那里填充密码。
1 2 3 | <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将"保存"
我已经测试过在所有主要浏览器的表单标签中添加autocomplete="off"。事实上,到目前为止,我们大多数人都在使用IE8。
Browser not asking"save password".
Also, previously saved username & password not populated.
号
2014年6月11日更新
最后,下面是一个使用JavaScript的跨浏览器解决方案,它在所有浏览器中都运行良好。
需要删除登录表单中的"表单"标记。在客户端验证之后,将该凭证置于隐藏形式并提交。
另外,添加两个方法。一个用于验证"validatelogin()",另一个用于在文本框/密码/按钮"checkandsubmit()"中单击Enter时侦听Enter事件。因为现在登录表单没有表单标记,所以在这里输入事件不起作用。
HTML
1 2 3 4 5 6 7 8 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //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(); } } |
。
祝你好运!!!!
不是这样的-你唯一能实际做的就是在网站上提供建议;也许,在他们第一次登录之前,你可以给他们显示一个包含信息的表单,表明不建议他们允许浏览器存储密码。
然后,用户将立即按照建议,将密码写在便条上,并将其贴到监视器上。
我一直在做的是将autocomplete="off"和使用javascript/jquery清除密码字段相结合。
jquery示例:
1 2 3 4 | $(function() { $('#PasswordEdit').attr("autocomplete","off"); setTimeout('$("#PasswordEdit").val("");', 50); }); |
通过使用
如果autocomplete="off"不起作用…请删除表单标记并改用DIV标记,然后使用jquery将表单值传递给服务器。这对我很有用。
因为autocomplete="off"不适用于密码字段,所以必须依赖于javascript。这里有一个基于这里找到的答案的简单解决方案。
将属性data password autocomplete="off"添加到密码字段:
1 | <input type="password" data-password-autocomplete="off"> |
。
包括以下JS:
1 2 3 4 5 6 7 8 9 | $(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。
我有工作要做,这可能会有所帮助。
你可以定制字体。因此,创建一个自定义字体,以所有字符为点/圆/星。将此字体用作网站的自定义字体。在Inkscape中检查如何执行此操作:如何创建自己的字体
然后在登录表单上使用:
1 2 3 4 5 | <form autocomplete='off' ...> <input type="text" name="email" ...> <input type="text" name="password" class="password" autocomplete='off' ...> <input type=submit> </form> |
然后添加CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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字体不会损坏。希望有帮助?
正因为如此,人们才意识到,"自动完成"属性在大多数情况下都有效,但超级用户可以使用书签来绕过它。
让浏览器保存您的密码实际上会增加对键盘记录的保护,因此最安全的选择可能是在浏览器中保存密码,但使用主密码(至少在Firefox中)保护它们。
我测试了很多解决方案。动态密码字段名,多个密码字段(对于假密码不可见),将输入类型从"文本"更改为"密码",autocomplete="off",autocomplete="new password",…但是最近的浏览器没有解决这个问题。
为了摆脱密码记忆,我最终将密码作为输入字段,并"模糊"输入的文本。
它比本机密码字段更不安全,因为选择键入的文本会显示为明文,但不会记住密码。它还取决于是否激活了javascript。
您将从导航器中估计使用以下建议与密码记忆选项的风险。
虽然密码记忆可以由用户管理(每个站点解除),但对于个人计算机,而不是"公共"或共享计算机,这是可以的。
我的案例是在共享计算机上运行的ERP,所以我将尝试下面的解决方案。
1 | <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"> |
解决此问题的最简单方法是将输入字段放在表单标记外,并在表单标记内添加两个隐藏字段。然后在提交事件侦听器中,在表单数据提交到服务器之前,将值从可见输入复制到不可见输入。
以下是一个示例(由于表单操作未设置为真正的登录脚本,因此不能在此处运行它):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <!doctype html> <html> <head> Login & Save password test <meta charset="utf-8"> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"> </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> // 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()); }); </body> </html> |
号
我的JS(jquery)解决方法是在表单提交时将密码输入类型更改为文本。密码可能会在一秒钟内变为可见,因此我也会在这之前隐藏输入。我不想将其用于登录表单,但它很有用(与autocomplete="off"一起使用),例如在网站的管理部分。
在提交表单之前,请尝试将其放入控制台(使用jquery)。
1 2 3 | $('form').submit(function(event) { $(this).find('input[type=password]').css('visibility', 'hidden').attr('type', 'text'); }); |
在铬44.0.2403.157(64位)上测试。
马库斯提出了一个很好的观点。我决定查找
The only downside to using this
attribute is that it is not standard
(it works in IE and Mozilla browsers),
and would cause XHTML validation to
fail. I think this is a case where
it's reasonable to break validation
however. (source)
号
所以我不得不说,尽管它不能百分之百地工作,但它是在主要浏览器中处理的,所以它是一个很好的解决方案。
我试过超越埃多克斯1〔5〕,但还是取得了成功。如果您使用Angular JS,我建议您使用按钮并单击ng。
1 | <button type="button" class="" ng-click="vm.login()" /> |
这已经有了一个可接受的答案。我补充说,如果有人不能用已接受的答案解决问题,他可以使用我的机制。
谢谢你的问题和答案。
我知道的一种方法是在提交表单之前使用(例如)javascript从密码字段中复制值。
这方面的主要问题是解决方案与JavaScript绑定在一起。
同样,如果它可以绑定到JavaScript,那么您也可以在向服务器发送请求之前在客户端散列密码。
由于大多数
这种方法的优点是它允许渐进式增强,因此不需要为字段使用JavaScript作为普通密码字段(您也可以从纯文本字段开始,并应用相同的方法,但这并不真正符合HIPAA PHI/PII)。这种方法也不依赖于隐藏的表单/字段,这些表单/字段可能不一定发送到服务器(因为它们是隐藏的),而且其中一些技巧在一些现代浏览器中也不起作用。
jquery插件:
https://github.com/cubiclesoft/php-flexforms-modules/blob/master/password-manager/jquery.stoppasswordmanager.js网站
上述链接中的相关源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | (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浏览器功能应该少做一些。
面对同样的HIPAA问题,找到了相对简单的解决方案,
创建一个以字段名作为数组的隐藏密码字段。
1 | <input type="password" name="password[]" style="display:none" /> |
。
对实际密码字段使用相同的数组。
1 | <input type="password" name="password[]" /> |
浏览器(Chrome)可能会提示您"保存密码",但无论用户选择"保存",下次登录时,密码都会自动填充隐藏的密码字段,即数组中的零插槽,使第一个插槽为空。
我试图定义数组,例如"password[part2]",但它仍然记得。我认为如果它是一个无索引数组,它就会抛出它,因为它别无选择,只能将它放在第一个位置。
然后使用您选择的编程语言访问数组,例如php,
1 | echo $_POST['password'][1]; |
。
真正的问题远不止是在HTML中添加属性——这是常见的安全问题,这就是为什么人们发明硬件密钥和其他疯狂的安全措施的原因。
假设您的autocomplete="off"在所有浏览器中都能很好地工作。这对安全有帮助吗?当然,不会。用户会把他们的密码写在教科书上,贴在显示器上每个办公室访客都能看到的标签上,保存到桌面上的文本文件中,等等。
一般来说,Web应用程序和Web开发人员不以任何方式对最终用户安全负责。最终用户只能保护自己。理想情况下,他们必须将所有密码保存在头脑中,并使用密码重置功能(或联系管理员),以防忘记密码。否则,总有一个风险,密码可以被看到和窃取不知何故。
所以要么你有一些疯狂的硬件密钥安全政策(比如,一些银行提供的互联网银行基本上采用了双因素认证),要么根本没有安全措施。当然,这有点夸张了。重要的是要了解你在试图保护什么:
在这篇特别的文章中,我可以看到对开发人员的需求不足,由于问题的本质——最终用户安全性,开发人员永远无法解决这个问题。我的主观观点是,开发人员基本上应该说"不",并指出需求问题,而不是在这样的任务上浪费时间,诚实地说。这并不能使您的系统更加安全,而是会导致显示器上出现贴纸的情况。不幸的是,有些老板只听到他们想听的。但是,如果我是你,我会尝试解释实际问题来自何处,并且autocomplete="off"不会解决问题,除非它会强制用户将所有密码都集中在他们的大脑中!开发人员不能完全保护用户,用户需要知道如何使用系统,同时不要暴露他们的敏感/安全信息,这远远超出了认证。
Is there a way for a site to tell the browser not to offer to remember passwords?
号
该网站告诉浏览器,它是使用
最好的解决方案是让用户配置他们的浏览器,这样它就不会记住密码。
我被赋予了一个类似的任务,通过浏览器禁用登录名和密码的自动填充,经过多次尝试和错误后,我发现下面的解决方案是最佳的。只需在原始控件之前添加以下控件。
1 2 3 4 5 | <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来说,这很好用。
autocomplete="off"不适用于在火狐31中禁用密码管理器,很可能在某些早期版本中也不适用。
查看Mozilla关于此问题的讨论:https://bugzilla.mozilla.org/show_bug.cgi?内径=956906
我们希望使用第二个密码字段输入由令牌生成的一次性密码。现在我们使用的是文本输入而不是密码输入。:
如果不希望信任自动完成标志,可以确保用户使用onchange事件在框中键入。下面的代码是一个简单的HTML表单。已编辑的隐藏表单元素密码开始设置为0。更改密码值时,顶部的javascript(pw_edited函数)将值更改为1。当按下按钮时,它会在提交表单之前检查这里的值输入代码。这样,即使浏览器忽略您并自动完成字段,用户也无法通过登录页面而不在密码字段中键入内容。此外,在设置焦点时,请确保将密码字段留空。否则,您可以在末尾添加一个字符,然后返回并删除它以欺骗系统。另外,我建议将autocomplete="off"添加到密码中,但是这个示例显示了备份代码的工作原理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <html> <head> 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(); } } </head> <body> <form name="this_form" method="post" action="../../cgi-bin/yourscript.cgi?login"> <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> </form> </body> </html> |
号
autocomplete="off"适用于大多数现代浏览器,但我使用的另一种方法成功地与epiphany(一个支持webkit的gnome浏览器)一起使用,是将随机生成的前缀存储在会话状态(或隐藏字段,我碰巧在会话状态中已经有了一个合适的变量),并使用它来更改字段的名称。epiphany仍然希望保存密码,但是当返回到表单时,它不会填充字段。
我使用此方法没有任何问题:
使用autocomplete="off",添加一个隐藏的密码字段,然后添加另一个非隐藏的密码字段。如果不遵守auto complete="off",浏览器将尝试自动完成隐藏的。
另一种解决方案是使用隐藏的表单制作日志,其中所有输入都是隐藏的类型。可见表单将使用"密码"类型的输入。后一个表单将永远不会被提交,因此浏览器无法截获登录的所有操作。
由于Internet Explorer 11不再支持
由于浏览器无法将密码与用户名关联,因此它不会提供存储密码的功能。这种方法适用于所有主要的浏览器(在编写时),并且在不使用JavaScript的情况下可以正常工作。缺点是对用户来说会更麻烦,登录操作需要2次回发,而不是1次回发,所以这取决于你的网站需要多安全。
更新:正如gregory在评论中提到的,firefox将遵循IE11的领导,忽略
我想把autocomplete="off"放在这里根本没用
我有其他的解决方案,
1 | <input type="text" name="preventAutoPass" id="preventAutoPass" style="display:none" /> |
号
在输入密码之前添加此项。
例如:
这不会阻止浏览器询问并保存密码。但它会阻止输入密码。
欢呼
imho,
最好的方法是随机化具有
您的登录表单将显示为…
1 2 3 4 5 | <form> <input type=password id=pwd67584 ...> <input type=text id=username ...> <input type=submit> </form> |
然后,在服务器端,当您分析客户机发布的表单时,捕获以"pwd"开头的名称的字段,并将其用作"密码"。