我已经研究过了,但找不到一种标准、可靠的方法来让浏览器防止自动填充,并且不记得标准登录表单中的密码。
这对我来说很重要,因为我正在开发一个移动网络应用程序,所以如果用户点击注销,其他人拿到了他们的手机,浏览器不应该只给他们密码就帮他们!
我能想到的唯一解决方案是将密码字段设置为type="text"。
当然,这意味着人们可以"肩上冲浪"并查看用户输入的内容,但同一个人几乎可以很容易地观察用户的手指,查看他们输入的密码…
我也不认为间谍软件是一个真正的问题,因为我不认为type="password"字符掩码会阻止恶意的键盘记录程序等。
因此,我想知道,在使用type="text"作为密码字段时,是否遗漏了其他安全问题?
也许如果我将这个想法与输入的动态/随机"名称"属性相结合,我会成为赢家吗?
注意-该解决方案需要符合XHTML Mobile Profile。
此外,请不要就这里的语义正确性向我提供建议。我的首要任务是安全性,而不是语义。:)
坏主意-浏览器会记住文本字段,只是不会像输入密码那样自动输入。相反,它会建议将密码作为一个自动完成,让所有人都能看到。我还认为,在别人肩上阅读密码比阅读他们的按键要容易得多。
一些浏览器不尊重密码的自动完成选项的原因可能是,密码是由一种单独的(理论上更安全的)处理/存储密码数据的方法处理的——显然,通过使用文本字段,你绕过了这个系统,带来了任何风险。
我不认为有一个不涉及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用户(较少受自动完成影响的用户)仍然可以选择