html 屏蔽没有type=password的输入字符

6psbrbz9  于 2022-12-16  发布在  其他
关注(0)|答案(7)|浏览(180)

所以我有一个新的浏览器保存密码的问题。假设我有一个密码框如下:

<input type="password" autocomplete="off" />

IE11和iOS 7.1中的Safari等新浏览器已经开始忽略密码框中的autocomplete=“off”,并让用户保存密码。在我的公司(一家银行),我们认为这是一个安全问题。
我想知道是否有人已经解决了这个问题,也许有人已经写了一个javascript插件,它屏蔽了一个普通的输入[type=text],这样autocomplete=“off”属性就可以被遵守了。
更新:
有关更多信息,下面是msdn上的自动完成文档:http://msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx

b09cbbtk

b09cbbtk1#

您可以使用自定义字体键入文本来进行假密码输入:

@font-face {
  font-family: 'password';
  font-style: normal;
  font-weight: 400;
  src: url(https://jsbin-user-assets.s3.amazonaws.com/rafaelcastrocouto/password.ttf);
}

input.key {
  font-family: 'password';
  width: 100px; height: 16px;  
}
<p>Password: <input class="key" type="text" autocomplete="off" /></p>

∮ ∮ ∮ ∮

请注意,这只会引起更多的安全问题。

yhived7q

yhived7q2#

这里有一个想法,但我建议它的情况下,浏览器得到自动填充错误的密码,而不是用于登录.可能需要有一个更好的标准来识别登录屏幕,使浏览器不必使用启发式寻找字段与type="password" .
type="text"加载带有密码字段的表单,这样浏览器的自动完成算法就会忽略它,当用户在该字段中输入内容时,切换它的type="password"
我不是一个很好的JavaScript程序员,但我黑了一个JSFiddle来展示它在理论上是如何工作的。
也许onfocus也是一种更好的方法,但我没有尝试。

sigwle7e

sigwle7e3#

对我有效的解决方案是这样的:
第一个输入类型应为text
在焦点事件中,将输入类型转换为password
侦听用户输入,如果输入字段值为空,则再次将类型设置为text
这种方式在开始和输入字段为空时,浏览器将不会显示建议。

cngwdvgl

cngwdvgl4#

首先,autocomplete = "off"应该在<form>元素上,而不是单独的字段上,这是因为浏览器通常会将给定表单中所有字段的值存储在一起(例如,允许为同一个站点保存多个用户名/密码组合)。
在表单中设置它,它应该很适合您。(虽然已经保存的密码通常仍然是自动完成的,所以在测试之前清除您的密码存储)
但是,如果这被认为是一个安全问题,我会建议您可能是在追逐错误的目标。
浏览器提供这个功能的原因是用户希望能够存储他们的登录凭证,阻止他们这样做并不会阻止他们这样做,如果用户真的想这样做,他们仍然有很多方法可以绕过它--有一些浏览器插件明确地设计为取消w autocomplete = "off"功能,并允许保存所有密码。
您的用户如何在他们的终端存储密码最终不是您所关心的安全问题,而且无论如何也不是您真正能够控制的事情。
事实上,如果我们阻止人们存储密码,他们很可能会在多个地方使用相同的密码(仅仅是因为人们没有能力记住他们使用的每个网站的不同密码),所以通过阻止他们保存密码,实际上可能会使用户的密码 * 更不 * 安全。
如果你的网站真的需要一个不允许保存密码的安全机制,那么你需要考虑一个完全替代的机制。例如,现在银行登录经常要求用户输入密码中的特定数字字符--例如 “请输入密码中的第五、第八和第十二个字符”
然而,这些方案更多地针对密码的安全传输而不是密码的存储:通过只输入某些给定的字符,我们根本不必输入或传输整个密码,因此不存在中途被黑客攻击的可能性。仍然假设用户可能会在某处记下密码(特别是如果他们必须计算出字符串中的第十二个字符)
这种方案对用户来说真实的痛苦,但确实提供了真正的登录安全性,而不必实际输入或传输密码。然而,它给登录过程增加了额外的难度,这意味着只有像银行这样真正高安全性的网站才可能使用这种方案而不是常规密码。

gcxthw6b

gcxthw6b5#

你有没有试过把name属性修改成一些可笑的东西?我相信自动完成功能是基于name属性的。我不是100%确定,但是在有限的测试中,我修改了name属性,改变了显示的自动完成数据的类型。
下面是一个明显的例子:name=“username”显示的是我的用户名,而name=“email”显示的是我以前输入的电子邮件地址。当我切换到name=“browsersAreStupidForImplementingThisFeature”时,我没有收到任何自动完成数据。
需要进一步测试,但可能是一个很好的开始?祝你好运

dy1byipe

dy1byipe6#

我们有一个用例,管理员可以查看其他用户的记录并进行修改。其中一个字段是其他用户的密码。在这种情况下,让密码管理器预先填充字段是一件“坏事”。所以我们最终做的是在页面加载后等待一小段时间,然后清除密码字段...

// After the page has loaded...
window.addEventListener('load', setTimeout(function() {
  // Wait a bit and then clear out the contents of the field
  document.getElementById('other-password').value='';
}), 100);

字符串

sxissh06

sxissh067#

我为此挣扎了很长一段时间,但这里有一个解决方案,为我解决了这个问题。
最初,将密码输入创建为“文本”输入:

<input type="text" name="mfa_psw" id="mfa_psw" autocomplete="off">

然后使用Javascript监听击键事件。如果密码输入为而不是null,则将类型转换为“password”。

<script type="text/javascript">
var pswInput = document.getElementById("mfa_psw");

pswInput.onkeyup = function(e){
    if(e.keyCode == 13){
        mfa(); // enter key pressed, call next function (i.e. log in)
        return false;
    } else {
        if (pswInput.value==null) {
            pswInput.type = 'text'; 
            // input is empty, covert to 'text' to prevent password autofil
        } else {
            pswInput.type = 'password'; 
            // input is not empty, convert to 'password' to hide text entry
        }
    }
}

注意:这个解决方案意味着用户密码的第一个字符在输入类型更改为'password'之前会暴露一段时间。但是,假设用户密码的长度超过1个字符,这真的不应该是一个问题!

相关问题