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

Ben*_*lan 2 html java security firefox google-chrome

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

    <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>' />
Run Code Online (Sandbox Code Playgroud)

我认为这会阻止用户名被保存,你知道为什么Chrome和FF似乎忽略了这个吗?

干杯,

Mat*_*att 6

我认为问题在于浏览器用于帮助易用的自动填表的更高实现.即使在指定时autocomplete="off",Google Chrome仍会填写这些密码,但我们可以用可预测的方式来破解此功能,从而实现我们正在寻找的功能.

注:禁用密码的自动完成一个坚实的理由是为了防止CSRF所概述这里.

考虑以下:

<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>
Run Code Online (Sandbox Code Playgroud)

现在将它与此进行比较:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意我是如何将密码字段加倍,但包含我实际想要处理的值的那个字段将被正确命名.因此,在可预见的方式中,浏览器,如谷歌浏览器"覆盖"的autocomplete="off"属性是通过搜索<input type="password" />,对于该浏览器已保存用户密码的登录ID字段后,立即来了.这就是为什么这个属性似乎不适用于某些浏览器,包括Chrome.

但是,通过使用我已经概述的这种方法,它实际上欺骗浏览器#password-breaker使用用户的密码预填充该字段(我们不会使用)并将实际#password字段留空.

我还没有在所有可能的浏览器和版本中对此进行测试,但我发现它现在是一个合理的"跨浏览器"兼容性解决方法,并且完全依赖于非工作autocomplete属性的补充步骤.