2013-02-08 105 views
4

我用春天记得我的服务。我看到一个奇怪的行为。记住我cookie的解码过程

步骤我走:

  • 登录使用的用户名/密码,我的网站和检查记住我复选框

  • 比我关闭浏览器,并打开一个新的浏览器,并打开新的浏览器。技术上我必须自动登录。这也正在发生。我正在使用PersistentTokenBasedRememberMeServices

  • 现在我再关闭浏览器,重新打开一个新的浏览器,当我尝试访问我的网站,我收到以下异常:

    SEVERE: Servlet.service() for servlet [appServlet] in context with path [/Spring-Security] threw exception org.springframework.security.web.authentication.rememberme.CookieTheftException: Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack. 
        at org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.processAutoLoginCookie(PersistentTokenBasedRememberMeServices.java:102) 
        at org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.autoLogin(AbstractRememberMeServices.java:115) 
        at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97) 
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
        at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    

    我向下钻取更多,我看到了我的过去两年请求记得我令牌SPRING_SECURITY_REMEMBER_ME_COOKIE价值为

    bUpwUUJ3dGpUcVJjaGpIYXJxcmFkdz09OlBBRlZXbDVnYmZZQjM2RmFYVDNVMXc9PQ

但弹簧解码的(org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.tokenRepository)

final String presentedSeries = cookieTokens[0]; 
    final String presentedToken = cookieTokens[1]; 

正确第一请求而在第二请求的解码它东西presentedToken不同导致的cookie盗窃异常。

这是正确的行为吗?我该如何解决这个问题?

+0

当用户通过cookie登录时,它''PersistentTokenBasedRememberMeService'总是创建一个新的令牌。 因此,对于2.和3.登录必须有不同的cookie值。 - 检查您的浏览器是否发送不同的cookie值。 – Ralph 2013-02-08 14:39:20

+0

我检查了浏览器每次发送相同的cookie。SPRING_SECURITY_REMEMBER_ME_COOKIE是MWJ0cmc0SGxFelJzcStXUmhsaVhtUT09OjI0cWlVcHk1Q2QrWVJTb2hKZU1BNmc9PQ我用萤火虫检查过。 – 2013-02-08 14:54:25

+0

我检查相同的cookie下面一行String ACCESS_TEXT = new String(Base64.decode(cookieValue.getBytes()));正在创建不同的值。这很奇怪... 。该行位于org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.decodeCookie(String)方法中。 – 2013-02-08 15:02:19

回答

0

我有这个完全相同的问题。 第一个请求是匹配令牌,然后创建一个新的令牌,但在此之后,第二个请求将到达(与第一个请求具有相同的令牌),并且令牌不再匹配!

我无法弄清楚为什么第二个请求会在第一个请求之后直接进入。

最后我的解决方案是子类PersistentTokenBasedRememberMeServices和覆盖processAutoLoginCookie方法。我只是评论了检查cookie盗窃例外(这会产生一个安全漏洞,但它可以接受我的目的)

如果您想要一个更安全的解决方案,您可以轻松地添加逻辑来匹配最后两个呈现的令牌。