为政府医疗保健机构工作的乐趣之一是必须处理有关处理 PHI(受保护的健康信息)的所有偏执。不要误会我的意思,我完全赞成尽一切可能保护人们的个人信息(健康、财务、上网习惯等),但有时人们会有点过于紧张。
恰当的例子:我们的一位州客户最近发现浏览器提供了方便的功能来保存您的密码。我们都知道它已经存在了一段时间并且是完全可选的,由最终用户决定是否使用它是一个明智的决定。但是,目前有一些骚动,我们被要求找到一种方法来禁用我们网站的该功能。
问题:网站有没有办法告诉浏览器不要提供记住密码的功能?我从事 Web 开发已经有很长时间了,但不知道我以前遇到过这种情况。
任何帮助表示赞赏。
我不确定它是否适用于所有浏览器,但您应该尝试在表单上设置 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');
此外
autocomplete="off"
利用
readonly onfocus="this.removeAttribute('readonly');"
对于您不希望他们记住表单数据的输入(username
、password
等),如下所示:
<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 Chrome
、Mozilla Firefox
、Microsoft Edge
等)上进行了测试,效果非常好。希望这可以帮助。
我一直在为这个问题苦苦挣扎,这个问题有一个独特的转折点。特权用户无法使用保存的密码,但普通用户需要它。这意味着特权用户必须登录两次,第二次强制执行不保存密码。
有了这个要求,标准的 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>
好吧,这是一个非常古老的帖子,但我仍然会给出我的解决方案,这是我的团队长期以来一直在努力实现的。我们刚刚在表单中添加了一个新的 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;}
您可以通过随机化用于每个节目的密码字段的名称来防止浏览器匹配表单。然后浏览器会看到与 url 相同的密码,但不能确定它是相同的密码。也许它正在控制其他东西。
更新:请注意,由于其他人指出的原因,这应该是使用自动完成或其他策略的补充,而不是替代它们。
另请注意,这只会阻止浏览器自动完成密码。它不会阻止它以浏览器选择使用的任意安全级别存储密码。
使用真正的 two-factor authentication 来避免对密码的唯一依赖,密码可能存储在比用户浏览器缓存更多的地方。
最干净的方法是使用 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"
输入在各自的“用户名”输入之后。
我已经测试了在所有主要浏览器的表单标签中添加 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();
}
}
祝你好运!!!
不是真的——你唯一能做的就是在网站上提供建议;也许,在他们第一次登录之前,您可以向他们展示一个表格,其中包含表明不建议他们允许浏览器存储密码的信息。
然后用户将立即听从建议,在便利贴上写下密码并将其粘贴到他们的显示器上。
我一直在做的是使用 javascript / jQuery 结合 autocomplete="off" 和清除密码字段。
jQuery 示例:
$(function() {
$('#PasswordEdit').attr("autocomplete", "off");
setTimeout('$("#PasswordEdit").val("");', 50);
});
通过使用 setTimeout()
,您可以在清除该字段之前等待浏览器完成该字段,否则浏览器将始终在您清除该字段后自动完成。
如果 autocomplete="off" 不起作用...删除表单标记并改用 div 标记,然后使用 jquery 将表单值传递给服务器。这对我有用。
因为 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。
就像人们意识到的那样——“自动完成”属性在大多数情况下都有效,但高级用户可以使用小书签绕过它。
让浏览器保存您的密码实际上增加了对键盘记录的保护,因此最安全的选择可能是将密码保存在浏览器中,但使用主密码保护它们(至少在 Firefox 中)。
我有一个解决方法,这可能会有所帮助。
您可以进行自定义字体破解。因此,制作一个自定义字体,例如所有字符为点/圆/星。将此用作您网站的自定义字体。检查如何在 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 字体没有损坏。希望能帮助到你?
解决这个问题最简单的方法是将INPUT字段放在FORM标签外,并在FORM标签内添加两个隐藏字段。然后在表单数据提交到服务器之前的提交事件侦听器中,将可见输入的值复制到不可见的值。
这是一个示例(您不能在此处运行它,因为表单操作未设置为真正的登录脚本):
我的 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 位)上测试。
我测试了很多解决方案。动态密码字段名称,多个密码字段(假的不可见),将输入类型从“文本”更改为“密码”,自动完成=“关闭”,自动完成=“新密码”,...但最近没有解决它浏览器。
为了摆脱密码记忆,我最终将密码视为输入字段,并“模糊”输入的文本。
它不如本机密码字段“安全”,因为选择键入的文本会将其显示为明文,但不会记住密码。它还取决于激活 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">
这是我的解决方案的 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"/>
马库斯提出了一个很好的观点。我决定查找 autocomplete
属性并得到以下信息:
使用此属性的唯一缺点是它不是标准的(它适用于 IE 和 Mozilla 浏览器),并且会导致 XHTML 验证失败。我认为这是一个打破验证是合理的情况。 (资源)
所以我不得不说,虽然它不能 100% 全面工作,但它是在主要浏览器中处理的,所以它是一个很好的解决方案。
真正的问题远不止在 HTML 中添加属性——这是常见的安全问题,这就是为什么人们发明了硬件密钥和其他疯狂的安全措施。
想象一下,您的 autocomplete="off" 在所有浏览器中都能完美运行。这对安全有帮助吗?当然不。用户将在教科书上、贴在显示器上的贴纸上写下他们的密码,每个办公室访问者都可以看到它们,并将它们保存到桌面上的文本文件中等等。
通常,Web 应用程序和 Web 开发人员不以任何方式对最终用户的安全负责。最终用户只能保护自己。理想情况下,他们必须将所有密码牢记在心,并使用密码重置功能(或联系管理员)以防忘记。否则,总会有密码被看到和以某种方式被盗的风险。
因此,要么您对硬件密钥有一些疯狂的安全策略(例如,一些银行提供基本上采用双因素身份验证的网上银行服务),要么基本上没有安全性。好吧,这当然有点过分夸大了。了解您要防范的内容很重要:
未授权访问。最简单的登录表单基本上就足够了。有时会采取其他措施,例如随机安全问题、验证码、密码强化等。凭据嗅探。如果人们从公共 Wi-Fi 热点等访问您的 Web 应用程序,HTTPS 是必须的。提到即使有 HTTPS,您的用户也需要定期更改密码。内线攻击。有两个这样的例子,从简单地从浏览器窃取密码或你在桌子上某处写下的密码(不需要任何 IT 技能)开始,到会话伪造和拦截本地网络流量(甚至加密)结束并进一步访问 Web 应用程序,就像它是另一个最终用户一样。
在这篇特定的帖子中,我可以看到对开发人员提出的不充分的要求,由于问题的性质——最终用户安全,他永远无法解决。我的主观观点是,老实说,开发人员基本上应该说“不”并指出需求问题,而不是在这些任务上浪费时间。这并不能绝对让您的系统更安全,而是会导致显示器上贴有贴纸的情况。不幸的是,有些老板只听到他们想听到的。但是,如果我是您,我会尝试解释实际问题的出处,并且 autocomplete="off" 不会解决它,除非它会迫使用户将所有密码完全保留在他们的脑海中!开发者本身不能完全保护用户,用户需要知道如何使用系统,同时不暴露他们的敏感/安全信息,这远远超出了身份验证。
我在 autocomplete="off"
上尝试过,但一切都成功了。如果您使用的是 Angular js,我的建议是使用按钮和 ng-click。
<button type="button" class="" ng-click="vm.login()" />
如果有人不能用接受的答案解决问题,他可以使用我的机制,这已经有一个可接受的答案。
感谢您的问题和答案。
enter
或 return
键提交表单。
我知道的一种方法是在提交表单之前使用(例如)JavaScript 将值从密码字段中复制出来。
这样做的主要问题是该解决方案与 JavaScript 相关联。
再说一次,如果它可以绑定到 JavaScript,那么您最好在向服务器发送请求之前在客户端对密码进行哈希处理。
面对同样的 HIPAA 问题,找到了一个相对简单的解决方案,
创建一个隐藏密码字段,字段名称为数组。 对实际密码字段使用相同的数组。
浏览器 (Chrome) 可能会提示您“保存密码”,但无论用户是否选择保存,下次登录密码时都会自动填充隐藏的密码字段,即数组中的零位,第一个位留空。
我尝试定义数组,例如“password[part2]”,但它仍然记得。我认为如果它是一个未索引的数组,它就会把它扔掉,因为它别无选择,只能把它放在第一个位置。
然后您使用您选择的编程语言来访问数组,例如 PHP,
echo $_POST['password'][1];
由于大多数 autocomplete
建议(包括已接受的答案)在当今的网络浏览器中都不起作用(即网络浏览器密码管理器忽略 autocomplete
),一个更新颖的解决方案是在 password
和 text
类型之间交换并在字段为纯文本字段时使背景颜色与文本颜色匹配,当用户(或类似 KeePass 的程序)输入密码时,它会继续隐藏密码,同时作为真正的密码字段。浏览器不会要求保存存储在纯文本字段中的密码。
这种方法的优点是它允许渐进式增强,因此不需要 Javascript 使字段充当普通密码字段(您也可以从纯文本字段开始并应用相同的方法,但这并不是真正的 HIPAA符合 PHI/PII 标准)。这种方法也不依赖于可能不一定发送到服务器的隐藏表单/字段(因为它们是隐藏的),并且其中一些技巧在几个现代浏览器中也不起作用。
jQuery插件:
来自上述链接的相关源代码:
(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 浏览器功能。
<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;"/>
网站有没有办法告诉浏览器不要记住密码?
该网站通过使用 <input type="password">
告诉浏览器这是一个密码。因此,如果您必须从网站的角度这样做,那么您将不得不改变它。 (显然我不推荐这个)。
最好的解决方案是让用户配置他们的浏览器,这样它就不会记住密码。
如果您不想信任自动完成标志,您可以确保用户使用 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>
autocomplete="off" 不适用于禁用 Firefox 31 中的密码管理器,并且很可能在某些早期版本中也不起作用。
查看 Mozilla 上有关此问题的讨论:https://bugzilla.mozilla.org/show_bug.cgi?id=956906
我们想使用第二个密码字段来输入由令牌生成的一次性密码。现在我们使用文本输入而不是密码输入。 :-(
我被赋予了类似的任务来禁用浏览器自动填写登录名和密码,经过大量试验和错误后,我发现以下解决方案是最佳的。只需在原始控件之前添加以下控件。
<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" 适用于大多数现代浏览器,但我使用的另一种与 Epiphany(GNOME 的 WebKit 驱动的浏览器)一起成功工作的方法是在会话状态(或隐藏字段,我碰巧有)中存储随机生成的前缀会话状态中的合适变量),并使用它来更改字段的名称。 Epiphany 仍然想保存密码,但是当返回到表单时,它不会填充字段。
不定期副业成功案例分享
input type="password"
字段的autocomplete="off"
。 msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx