【问题标题】:Session timeout kills CSRF token, making subsequent remember-me workflow fail会话超时杀死 CSRF 令牌,使后续的记住我的工作流程失败
【发布时间】:2015-06-19 15:34:23
【问题描述】:

我有一个基于 Spring Security 和 Spring MVC 的 Spring 4 Web 应用程序。它包括 CSRF 保护,以及记住我的功能。其后包括配置的相关部分。

<sec:http auto-config="true">
    <sec:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <sec:intercept-url pattern="/**" access="ROLE_USER" />
    <sec:access-denied-handler error-page="/403" />
    <sec:form-login
        login-page="/public/login"
        authentication-failure-url="/public/login?error"
        authentication-success-handler-ref="authenticationSuccessHandler"
        username-parameter="userName"
        password-parameter="password" />
    <sec:logout
        logout-url="/logout"
        logout-success-url="/public/login?logout"
        delete-cookies="JSESSIONID" />
    <sec:remember-me
        services-ref="rememberMeServices" key="***" />
    <sec:csrf />
</sec:http>

<bean id="securityService" class="custom UserDetailsService" />
<bean id="authenticationSuccessListener" class="custom ApplicationListener" />
<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices">
    <property name="key" value="***" />
    <property name="userDetailsService" ref="securityService" />
    <property name="tokenRepository" ref="custom PersistentTokenRepository" />
    <property name="parameter" value="rememberMe" />
</bean>
<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <property name="targetUrlParameter" value="targetUrl" />
</bean>

场景:用户打开一个 POST 表单并开始填写它,接到一个电话或其他什么,会话超时,使 CSRF 令牌无效,用户提交他的表单,并得到一个“拒绝访问”。我一直在通过手动删除浏览器中的 JSESSIONID cookie(留下 SPRING_SECURITY_REMEMBER_ME_COOKIE)来测试这种情况。

期望:当会话超时时,remember-me 启动,对用户进行身份验证,请求被成功处理。

问题:鉴于 CSRF 和记住我的性质,我的期望是否合理,还是存在根本缺陷?推出我自己的 CsrfTokenRepository 实现,将令牌存储在数据库中而不是会话中是否有意义?对于上述场景,普遍接受的方法是什么?

提前致谢。

【问题讨论】:

  • 记住我会让你跳过登录过程,但出于安全原因,CSRF 令牌和会话属性必须在过期时间后失效。所以我的建议是增加过期时间以更合适价值。
  • 感谢您的评论。这是我作为临时解决方案所做的,我想我会保留它。

标签: java spring spring-security


【解决方案1】:

您需要警告用户会话即将到期。

如果您的系统支持实体的草稿版本,您可以在会话超时之前自动保存草稿。

然后显示一个对话框,指示会话已超时并且他们需要再次登录,或者至少单击刷新。为了获得良好的安全性,您应该将它们重定向到登录页面。

<script>

/* where n is the number of seconds until session times out on server */

window.setTimeout(function(){

  autoSaveCurrentForm();
  showWarning();

}, n);

</script>

【讨论】:

  • 感谢您的回答。不幸的是,问题不在于丢失输入的数据(我有一些重要表单的自动保存功能),而是让用户选择“记住我”,然后被要求在这里和那里登录。对于用户体验来说,这根本就不一致(我会得到类似“记住我不起作用”的票),但我现在会接受它。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 2021-04-30
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2019-08-17
相关资源
最近更新 更多