我已对以下内容进行了修改,以防止用户用户名出现在登录框中。
<div class="row clearfix">
<label for="j_username">Username:</label>
<input tabindex="1" type="text" name="j_username" id="j_userName" class="text" value='<c:if test="${param.login_error == 'authFailure'}">${SPRING_SECURITY_LAST_USERNAME}</c:if>' />
<p class="forgot-password">
<a tabindex="5" href="forgot-username-password.htm">Forgot your username or password?</a></p>
</div>
<input tabindex="1" type="text" name="j_username" id="j_userName" **autocomplete="off"** class="text" value='<c:if test="${param.login_error == 'authFailure'}">${SPRING_SECURITY_LAST_USERNAME}</c:if>' />
我认为这可以防止用户名被保存,你知道为什么Chrome和FF似乎忽略了这个吗?
欢呼,本
答案 0 :(得分:6)
我认为问题在于浏览器用于帮助易用的自动填表的更高实现。即使指定autocomplete="off"
,Google Chrome仍会填写这些密码,但我们可以用可预测的方式打破此功能,从而实现我们正在寻找的功能
注意:禁用自动填写密码的一个重要原因是CSRF预防,如here所述。
请考虑以下事项:
<form action="login.asp" method="post" class="form-horizontal" name="login-form" role="form" autocomplete="off">
<input type="hidden" name="<%=STATIC_CSRF_TOKEN_NAME%>" value="<%=AntiXssInstance.HtmlAttributeEncode(GetExternalCSRFToken())%>" />
<input type="email" class="form-control" id="email" name="email" placeholder="Email address">
<input type="password" class="form-control" id="password" name="password" placeholder="Password">
<button type="submit" class="btn btn-success">Login</button>
</form>
现在将其与此进行比较:
<form action="login.asp" method="post" class="form-horizontal" name="login-form" role="form" autocomplete="off">
<input type="hidden" name="<%=CSRF_TOKEN_NAME%>" value="<%=GetExternalCSRFToken()%>" />
<input type="email" class="form-control" id="email" name="email" placeholder="Email address">
<input type="password" style="display: none;" id="password-breaker" />
<input type="password" class="form-control" id="password" name="password" placeholder="Password">
<button type="submit" class="btn btn-success">Login</button>
</form>
请注意我是如何将密码字段加倍的,但是包含我实际想要处理的值的那个字段将被正确命名。因此,谷歌浏览器等浏览器可以预测的方式覆盖&#34; autocomplete="off"
属性是搜索,用于<input type="password" />
紧跟在浏览器已存储用户密码的登录ID字段之后。这就是为什么这个属性似乎不适用于某些浏览器,包括Chrome。
然而,通过使用我已经概述的这种方法,它基本上欺骗浏览器预填充#password-breaker
字段(我们将不会使用)与用户&#39;密码并将实际的#password
字段留空。
到目前为止,我还没有在所有可能的浏览器和版本中对此进行过测试,但我发现它现在是一个合理的跨浏览器&#34;兼容性解决方法和完全依赖于非工作autocomplete
属性的补充步骤。