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


423

在政府医疗机构工作的乐趣之一是必须处理与PHI(受保护的健康信息)打交道有关的所有偏执狂。不要误会我的意思,我全力以赴来尽一切可能保护人们的个人信息(健康,财务,上网习惯等),但是有时候人们会显得有些过份。

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

问题:网站是否可以告诉浏览器不要提供记住密码的方法?我从事Web开发已有很长时间了,但是我不知道我以前曾遇到过。

任何帮助表示赞赏。


6
您应该提供一个油脂猴子脚本,以便人们可以重新启用它。我认为用户不希望每次都被迫输入密码...
ThiefMaster 2011年

14
这个问题应该是有用和清楚的。另一方面,我不希望人们找到解决该“问题”的方法。
伊恩·博伊德

11
这并不总是一个“问题”。我来这里是因为firefox提示您为包含WiFi / SSID密码的表单而不是登录用户名/密码表单保存密码。这很烦人,我想阻止它。
2014年

1
如果信息至关重要,则不仅应使用密码来保护它。
山姆·沃特金斯2015年

一种有效的方法是不使用<form>。如果您使用JavaScript发送数据(XHR),则不需要它。我想在使用“一次性密码”身份验证的系统中禁用(没有理由存储它)。对于用户/通过身份验证,我不建议禁用该功能。
lepe

Answers:


322

我不确定它是否可以在所有浏览器中使用,但是您应该尝试在表单上设置autocomplete =“ off”。

<form id="loginForm" action="login.cgi" method="post" autocomplete="off">

禁用“表单和密码”存储提示并防止将表单数据缓存在会话历史记录中的最简单方法是使用值为“ off”的自动完成表单元素属性。

来自http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion

一些较小的研究表明,此方法可在IE中使用,但我不做任何保证;)

@Joseph:如果严格要求通过带有实际标记的XHTML验证(不知道为什么会这样),则理论上可以在以后使用javascript添加此属性,但是随后禁用了js的用户(用户群的数量可忽略不计)或零(如果您的站点需要js),则仍然会保存其密码。

jQuery示例:

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

48
简短的评论,由于这种情况正在发生变化,HTML5将autocomplete属性添加到了规范中,因此现在有效。
Tyler Egeto 2011年

11
仅供参考,微软决定的Internet Explorer 11将不再荣誉autocomplete="off"input type="password"领域。msdn.microsoft.com/zh-CN/library/ie/ms533486%28v=vs.85%29.aspx
JW Lim

6
就像@JWLim提到IE 11放弃对禁用密码保存功能的支持一样,Firefox也是如此。 bugzilla.mozilla.org/show_bug.cgi?id=956906
Gregory Cosmo Haun 2014年

3
Firefox(不幸的是)跟随了Microsoft的领导,也“删除了”自动完成支持。有关详细信息,请参见以下问题讨论中的评论100:bugzilla.mozilla.org/show_bug.cgi?id=956906
弹跳位

8
现在,不适用于Firefox 38+ mozilla.org/zh-CN/firefox/38.0/releasenotes
Illuminator

44

此外

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');" >

测试在主流浏览器的最新版本的IE Google ChromeMozilla FirefoxMicrosoft Edge等,像一个魅力的作品。希望这可以帮助。


2
@MuratYıldız:我必须实现相同的功能,并且遵循您的代码,在所有浏览器中都可以正常工作。谢谢 !
SREE

1
@Sree我很高兴它对您有所帮助:)
MuratYıldız16年

3
刚刚测试了Mozilla Firefox 52.0Google Chrome 57.0Microsoft Edge 38.1并像魅力一样工作!..
MuratYıldız17年

1
有可能在Safari移动作为这个答案的错误修复它stackoverflow.com/questions/2530/...
Ferie酒店

1
Windows Firefox 57.0.2(64位)在实现此功能后仍建议保存密码。
Panu Haaramo '12

37

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

有了这一要求,标准autocomplete="off"方法就不能在所有浏览器上都适用,因为密码可能是从首次登录时保存的。一位同事找到了一种解决方案,当使用新的密码字段替换密码字段时将其替换,然后专注于新的密码字段(然后连接相同的事件处理程序)。这行得通(除非它在IE6中引起了无限循环)。也许可以解决这个问题,但这使我偏头痛。

最后,我尝试仅在表单之外输入用户名和密码。令我惊讶的是,这行得通!它适用于IE6,以及Linux和Firefox上的最新版本。我没有对其进行进一步的测试,但是我怀疑它可以在大多数浏览器(即使不是所有浏览器)中正​​常工作(但是,如果有一个浏览器不在乎是否没有表单,这也不会令我感到惊讶)。

这是一些示例代码,以及一些使其工作的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>

1
这看起来是一个很好的解决方案。这很有意义,因为您发送的表单本身并不包含密码。我想确保您可以使用两种形式,第一种形式只是为了确保用户名和密码在所有浏览器中都可见。
亚历克西斯·威尔克

3
我喜欢您的解决方案,并在我的网站上实现了类似的解决方案,这很荒谬,如今,浏览器没有提供解决此问题的简单方法。
AgelessEssence 2014年

不知道是否是因为我坚持使用jquery 1.6,但是上面的jquery仅在包装在$(document).ready(function(){})内后才起作用。
rgb

唯一正确的解决方法是此,因为某些浏览器不再接受autocomplete =“ off”!
阿巴迪斯

1
我刚刚在chrome,opera和Internet Explorer上尝试了此方法,它似乎可以工作,但是不幸的是,它不适用于Firefox
chenks

29

好吧,这是一个非常古老的职位,但我仍然会给出我的解决方案,我的团队一直在努力解决。我们只是在表单内添加了一个新的输入type =“ password”字段,并将其包装在div中,并使div隐藏。确保此div在实际密码输入之前。这对我们有用,并且没有提供任何“保存密码”选项

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

1
与使用隐藏输入的用户相比,这种方式的一个优点是,这种方式永远不会将密码存储在纯文本字段中
pvgoddijn 2014年

@ whyAto8这在Chrome 47.0.2526.111中对我不起作用...使其起作用的技巧是在隐藏的div中添加另一个字段文本。浏览器要求保存密码,但提示“您确定要保存此密码吗?” 然后显示一个空白的用户名和一个空白的密码。这已经奏效了。
DavidBélanger'16

1
whyAto8的解决方案以及@DavidBélanger的评论对我有用(其他解决方案都没有)。我还应该提到的是,在实际用于数据输入的字段之前,我添加了两个空白的隐藏字段,并且重复的(隐藏的)字段分别具有相同的名称。这样,Chrome(48.0.2564.103)甚至不会询问是否应保存任何密码。
瓦迪姆

在Chrome 48.0.2564.116上无法将其组合使用。即使结合了DavidBelanger的评论,如果您单击“确定”,Chrome弹出窗口要求您保存密码仍会缓存密码
ChrisO

好的答案..请您告诉我,为什么您说“确保此div在实际的密码输入之前”?我把那个div放在了实际的密码输入之后,它仍然可以工作。
马丁AJ

16

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

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

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


5
[@Joel](#32409)可能会阻止自动填充,但会是防止浏览器然后询问是否保存密码这种形式应该新形式?
Joseph Pecoraro

3
我认为这现在行不通。在FF 13中,我有一个包含多个密码字段的表单,所有密码字段的名称不同。FF一旦为该页面保存了密码,便将保存的密码粘贴到所有密码字段中。它不在乎字段的名称是什么(例如,我有“ new_password”和“ old_password”,并且保存的密码会同时转储到两个字段中)。在这种特殊形式下,我没有用于保存密码的用户名-只有两个密码字段,以防万一。
杰森

1
点头@Jason,提供密码领域的新UUID的名字每一次什么也没做,以打败浏览器的企图,以填补它英寸
FP自由

14

使用真正的两因素身份验证可避免仅依赖密码,而密码可能存储在比用户浏览器缓存更多的地方。


2
顺便说一句,是身份验证而不是身份验证
乔纳森(Jonathan)。

26
@Jonathan Pity,我更喜欢身份验证
Ian Boyd

另一个解决方案可能是实现JavaScript,一旦用户从应用程序注销,该JavaScript就会强制关闭浏览器。这将刷新浏览器的全部内存,因此无法从浏览器的内存中检索任何数据。
Ajay Takur

13

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

这是一个丑陋的hack,因为您更改了浏览器的行为,应将其视为不良做法。仅在确实需要时使用它。

注意:这将有效地停止密码自动填充,因为FF会“保存” #prevent_autofill(空)值,并尝试在其中填充所有已保存的密码,因为它始终使用type="password"在相应“用户名”之后在DOM中找到的第一个输入。输入。


阻止浏览器填写密码但允许其存储密码有什么意义?它只会欺骗用户,使他们以为实际上很容易受到攻击而没有存储密码。
CodesInChaos

这样,它实际上不会存储您的密码,因为您键入了另一个框,而该框被FF忽略。相反,它将存储一个空字符串。
venimus 2015年

@CodesInChaos恕我直言,您应该重新考虑您的否决权,因为您的担心无效
venimus

12

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

  1. IE8,IE9,IE10,Firefox,Safari都可以正常工作。

    浏览器不询问“保存密码”。同样,先前保存的用户名和密码也不会填充。

  2. Chrome&IE 11不支持autocomplete =“ off”功能
  3. FF支持autocomplete =“ off”。但是有时会填充现有的已保存凭据。

2014年6月11日更新

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

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

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

的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);" /> 

Java脚本

//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 2014年

@JW Lim,我已经更新了答案。请调查一下。谢谢!
Asik 2014年

@Sivakumar,好的,请提供Safari的操作系统和版本。让其他人也知道。它在我的系统中运行(Windows 8,Safary 5)
Asik

@Asik Safari 8.0.3和Mac OS 10.10
Sivakumar,

7

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

然后,用户将立即按照建议进行操作,将密码写在便条纸上并将其粘贴到显示器上。


10
您必须记住,这是一个政府网站,此类事情在政治上受到指控。如果一个高高的人说:“它一定不能这样工作”,那么现实不是等式的一部分。该问题可能会转移到Post-It便笺上,但是有关这些问题的政策是由其他部门处理的-问题已经转移;-)我实际上是认真的。
杰森

6

我一直在做的事情是将autocomplete =“ off”和使用javascript / jQuery清除密码字段结合在一起。

jQuery示例:

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

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



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 '12

2

人们意识到-“自动完成”属性在大多数情况下都有效,但是高级用户可以使用书签来解决它。

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


2
“但是高级用户可以解决它” –适用于大多数应用程序功能,无论是否适用于Web,这都不应该成为限制系统的理由。人们还可以将密码写在便利贴上并将其放在监视器上,从应用程序的角度来看,您只能做很多事情以确保安全,并且提供有意义的默认行为(而不是在本地保存)是一个开始。
Niels Keurentjes 2014年

2

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

您可以进行自定义字体修改。因此,制作一个自定义字体,所有字符都以点/圆/星为例。使用它作为您网站的自定义字体。检查如何在inkscape中执行此操作:如何制作自己的字体

然后在登录表单上使用:

<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
很整洁的解决方案是有密码的字体在这里
安德鲁·

6
如果使用这种解决方案,则需要考虑到用户可以自由复制在此相似密码字段中输入的文本。复制和剪切功能在真实密码字段上被禁用。

2

解决此问题的最简单方法是将INPUT字段放置在FORM标记之外,并在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 '12

好吧,这只是一个hack,可能随时会停止工作:)
膝盖可乐

这是最好的选择!只需在提交前清除密码字段即可:$('。password')。val('')
ebelendez

2

我的js(jquery)解决方法是将密码输入类型更改为表单commit上的文本。密码可能会显示一秒钟,因此在此之前我也隐藏了输入。我不希望将其用于登录表单,但是它很有用(与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上使用!
Lu55

那是真实的。现在,我在FF 44.0.2中尝试了此操作,此hack不再起作用了……真可惜。在Chrome中,这仍然有效。
椭圆

您可以将输入[type = submit]或button [type = submit]替换为常规的button [type = button],然后在onclick处理程序中执行此操作。如果表单中不存在[type = submit],它也将阻止使用回车键和保存密码提示显示表单。
史蒂文·唐

2

我测试了很多解决方案。动态密码字段名称,多个密码字段(对于假密码字段不可见),将输入类型从“文本”更改为“密码”,autocomplete =“ off”,autocomplete =“ new-password”,...但是最近没有解决方案浏览器。

为了忘记密码,我终于将密码作为输入字段,并对输入的文本进行“模糊处理”。

它不如本地密码字段“安全”,因为选择键入的文本会将其显示为明文,但不会记住密码。它还取决于激活Javascript。

您将估计使用来自导航器的以下建议vs密码记住选项的风险。

尽管密码记忆可以由用户管理(按站点分配),但对于个人计算机,而不是“公用”或共享计算机,这是很好的选择。

我的情况是针对在共享计算机上运行的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">

1

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

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

因此,我不得不说,尽管它不能全面运行100%,但可以在主要的浏览器中进行处理,因此它是一个很好的解决方案。


我有按照w3c标准进行验证的问题。问题是我希望移动银行网站具有此功能。我假设移动浏览器足够严格,如果使用了一些无效的属性,有时可能会弄乱表格。在这种情况下,您有什么建议?
突袭2010年

2
我认为这是一种古老的思维方式。许多最新的移动浏览器都是基于WebKit构建的,它们支持或优雅地忽略了此属性。我不知道其他国家/地区或较旧手机中的浏览器如何处理此问题,但是如何优雅地处理未知的属性/元素是好的浏览器的基础。它“证明未来”的浏览器不会随着网络的发展而中断。它可能会落后(未实现新功能),但不会中断。希望对您有帮助=)
Joseph Pecoraro

1
它应该是对所引用答案的评论,而不是对问题本身的答案。
viam0Zah 2010年

1

我在上面尝试过autocomplete="off",但仍然成功。如果您使用的是Angular JS,我的建议是使用button和ng-click。

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

这已经有了一个可接受的答案,如果有人用我的机制无法解决这个可接受的答案的问题,则可以添加这个答案。

感谢您的问题和答案。


这显然会破坏按enterreturn键提交表单的过程。
8eecf0d2

0

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

这样做的主要问题是解决方案与JavaScript绑定在一起。

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


客户端的哈希不能替代服务器端的哈希。我不确定是否有任何帮助(如果另外做的话)。
Brilliand 2012年

2
在客户端允许散列是危险的,因为这意味着攻击者无需从散列中破解密码,他们只需使用散列即可登录。散列变为等效于密码。
rjmunro 2012年

我同意Brilliand的观点,客户机上的哈希仅在将密码保存到数据库中之前在服务器上也具有哈希的情况下才有用。但是,在客户端使用哈希可以帮助中间层的人解决某些问题。话虽如此,由于该代码(至少在公共站点上)可供黑客使用,因此它可能不像看起来那样有用。
亚历克西斯·威尔克

0

真正的问题比向HTML添加属性要深得多-这是常见的安全问题,这就是为什么人们发明硬件密钥和其他疯狂的东西来保证安全的原因。

假设您在所有浏览器中都能完美地使用autocomplete =“ off”。这对安全性有帮助吗?当然不。用户将在教科书中的密码上写下他们的密码,在监视器上贴的贴纸上,每个办公室访问者都可以看到它们,并将其保存到桌面上的文本文件中,等等。

通常,Web应用程序和Web开发人员对最终用户的安全性不承担任何责任。最终用户只能保护自己。理想情况下,他们必须将所有密码都保留在头脑中,并使用密码重置功能(或与管理员联系)以防万一忘记密码。否则,总是存在以某种方式可以看到和窃取密码的风险。

因此,要么您有了一些带有硬件密钥的疯狂安全策略(例如,某些银行提供的Internet银行业务基本上采用了两因素身份验证),要么根本没有安全性。好吧,这当然有点夸张了。重要的是要了解您要防止什么:

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

在这篇特别的文章中,我可以看到对开发人员的需求不足,由于问题的性质-最终用户安全性,他将无法解决这些需求。我的主观观点是,开发人员应该基本上说不,并指出需求问题,而不是老实地浪费时间在此类任务上。这并不能绝对使您的系统更安全,而是会导致在显示器上贴有贴纸的情况。不幸的是,有些老板只听到他们想听的话。但是,如果我是您,我将尝试解释实际问题的出处,而autocomplete =“ off”并不能解决问题,除非它将迫使用户将所有密码都保留在自己的头上!开发人员无法完全保护用户,


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
这样,您就隐藏了一个安全问题-密码的哈希值仍存储在浏览器的缓存中。
亚历山大·伯拉克维奇

1
你能澄清一下吗?密码将使用POST以纯文本形式发送。据我所知,POST请求无法缓存。您是说使用POST发送数据还有其他选择吗?或者您是说密码存储在浏览器中,因为它不是存储密码,而是存储数组开头的空值,您是否测试了此方法?
迈克,

0

由于大多数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浏览器功能。


-1

网站是否可以告诉浏览器不要提供记住密码的方法?

该网站通过使用告诉浏览器它是密码<input type="password">。因此,如果必须从网站角度执行此操作,则必须进行更改。(显然,我不建议这样做)。

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


3
不建议您更改输入类型字段有多么明显?详细阐述安全问题将有所帮助。
Karl

1
@karl:因为必须在开放状态下键入密码才能进行“肩膀冲浪”,所以通过在键入密码时查看屏幕来收集密码。
David Schmitt,2010年

不仅是人的肩膀冲浪,而且间谍软件或病毒也可以观看您的屏幕并查看在纯文本字段中键入的内容。
卡尔

6
@karl:如果您的计算机上装有间谍软件/病毒,则没有任何星号保护功能可以为您节省很多时间。对于已安装的应用程序而言,拦截输入到“密码”字段中的内容并不比对纯文本字段执行相同的操作更为困难。
Markus Olsson 2010年

3
另外,如果浏览器看到的是常规文本输入而不是密码输入,则可能会将密码存储在自动完成数据库而不是密码数据库的形式中……然后建议它甚至在一些不相关的网站上自动填充它!因此,实际上,您甚至比开始时情况更糟。
zwol 2011年

-1

如果您不希望信任自动完成标志,则可以确保用户使用onchange事件在框中键入内容。下面的代码是一个简单的HTML表单。隐藏的表单元素password_edited开始设置为0。更改password的值时,顶部的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>


-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来说,这工作正常


-2

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


这比通常的存储方式还要糟糕,因为现在用户看不到密码已被保存,同时也不能阻止攻击者从商店中提取密码。
CodesInChaos

-2

使用此方法,我没有任何问题:

使用autocomplete =“ off”,添加一个隐藏的密码字段,然后添加另一个非隐藏的密码字段。如果浏览器不遵守autocomplete =“ off”,则尝试自动完成隐藏的浏览器


-2

另一种解决方案是使用所有输入均为隐藏类型的隐藏形式进行POST。可见形式将使用“ password”类型的输入。后一种形式将永远不会提交,因此浏览器无法拦截所有登录操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.