jsp autocomplete =“off”无法在Chrome或Firefox中使用

时间:2014-03-26 15:55:16

标签: java html security google-chrome firefox

我已对以下内容进行了修改,以防止用户用户名出现在登录框中。

    <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似乎忽略了这个吗?

欢呼,

1 个答案:

答案 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属性的补充步骤。