【问题标题】:Is it safe to use type="text" for password field?将 type="text" 用于密码字段是否安全?
【发布时间】:2013-01-25 03:58:18
【问题描述】:

我已经对其进行了研究,但找不到一种标准、可靠的方法来使浏览器阻止自动填充并且不记住标准登录表单中的密码。

这对我来说很重要,因为我正在开发一个移动网络应用程序,所以如果用户点击注销并且其他人拿到了他们的手机,浏览器不应该只通过给他们密码来帮助他们!

我能想到的唯一解决方案是让密码字段 type="text"。

当然,这意味着人们可以“冲浪”并查看用户正在输入的内容,但同一个人几乎可以轻松地观察用户的手指以查看他们正在输入的密码......

我认为间谍软件在这里也不是一个真正的问题,因为我认为 type="password" 字符掩码不会阻止恶意键盘记录器等执行其操作。

那么,我想知道在密码字段中使用 type="text" 是否还有其他安全问题我可能遗漏了?

也许如果我将这个想法与输入的动态/随机“名称”属性结合起来,我能成为赢家吗?

注意 - 解决方案需要与 XHTML Mobile Profile 兼容。

另外,请不要就此处语义正确的内容向我提供建议。我的首要任务是安全性,而不是语义。 :)

【问题讨论】:

  • 没有什么能阻止浏览器记住文本输入。事实上,它可能会更容易记住它们,因为它们“对安全不敏感”。
  • 浏览器记住或不记住任何东西是设备设置,而不是服务器设置。您可以向用户提出建议,但如果他们希望他们的设备记住他们的密码,那么您不应该试图破坏这一点。
  • 谢谢,大卫,但我认为必须有比要求人们离开并调整他们的设备设置更好的解决方案。绝大多数用户会觉得这太麻烦了,并且以前从未接触过这些设置。无论如何,我并没有破坏任何用户偏好,因为我提供了自己的“记住密码”复选框。
  • Deceze,到目前为止我运行的测试表明相反。浏览器设置的问题在于,一旦用户(通过浏览器对话)允许浏览器记住密码,他们就很难让浏览器忘记密码。 (在“记住密码”和“注销”中添加一些 UI 代码对每个人来说都容易得多......)
  • 另外,Deceze,浏览器似乎没有记住密码,因为我在我的问题中描述的输入使用动态/随机“名称”属性。但是,如果我使用带有动态/随机“名称”属性的 type="password",则密码 is 会自动填充。

标签: html browser input passwords autofill


【解决方案1】:

坏主意 - 浏览器会记住文本字段,只是不会像使用密码那样自动输入它们。相反,它会建议密码作为自动完成供所有人查看。我还认为从别人的肩膀上读取密码比读取他们的击键要容易得多。

一些浏览器不尊重密码自动完成选项的原因可能是因为密码是由一个单独的(理论上更安全的)处理/存储密码数据的方法处理的 - 显然通过使用文本字段,你正在绕过这个系统风险。

我认为没有不涉及 js 的明确解决方案,因为归根结底,您无法真正控制他们的浏览器记住的内容。您只能提供提示和建议。这将由不同的浏览器以不同的方式处理。最好的办法是先添加:

自动完成=“关闭”

到您的表单和输入。适用于大多数浏览器 - 但不是全部。

以上内容会出现在您的表单标签和密码输入标签中,类似于:

<form id="form1_randomstring" name="form1" method="post" action="process.php" autocomplete="off">
<input name="password_randomstring" type="password" value="">

正如您在问题中所说,随机化表单和输入名称也会欺骗一些浏览器,使其认为它正在处理不同的表单

此外,如果您使用 ssl,浏览器会更加保守地记住它们所记住的内容。所以这可能会有所帮助。

最后,作为另一层保护,您可以使用一点 onload jquery 在 docready 上手动清除表单字段:

$("input[type='password']").val('');

如果不运行 js,显然没有帮助。

最终解决方案(也许?) 您可以更进一步,使用 ajax 调用注入表单字段(加上生成随机表单名称 + 自动完成并通过 ssl 提供页面)。这意味着 js 将是登录的要求,但您可以确保该字段清晰并在页面加载后生成表单。我会挑战任何浏览器来完成它。

如果您选择该选项,则外部页面和 ajax 加载页面都必须通过 ssl 运行 - 如果您不希望这样做,另一种选择可能是通过 iframe 加载 ssl 表单(再次权衡 - 用户群需要考虑。)

根据您的要求和用户群,这可能是最有保障的选择。

注意

Autocomplete="off" 可能无法通过严格的 XHTML 验证。然后一个选项可能是在使用 jquery 加载页面后添加 autocomplete 属性(同样,显然这在没有启用 js 的情况下不起作用):

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

另外一点,防止键盘记录器的最简单方法是提供一个选择选项下拉框,并要求他们输入密码中的字母/数字。实际上,您必须将密码限制为字母数字,并要求用户在一系列下拉菜单中从他们的密码中输入至少三个字母/数字。

总结

没有完美的解决方案,但有很多选择,你必须考虑什么是适合你的。我可能会将 ajax 调用作为主要方法。您最初可以加载表单的链接并用 ajax 内容动态替换它,以便非 js 用户仍然可以选择(更少的用户受到自动完成的影响)

【讨论】:

  • 单独使用 autocomplete="off" 在 FireFox (v18.0.2) 中不起作用,而与 type="text" 结合使用似乎确实有效。
  • 您在表单和密码字段中设置了吗?您可以尝试的另一件事是通过 ssl 运行表单。它应该对它记住的内容更加谨慎。
  • “随机化表单和输入名称也会诱使一些浏览器认为它正在处理不同的表单”——尽管这可能会在每次表单完成时将文本/密码保存在自动完成数据库中(具有不同的字段名称)。任何有权访问浏览器的人都可能查看此信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多