【问题标题】:Is it possible to add same-site attribute to Spring Security CSRF's .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())是否可以将相同站点属性添加到 Spring Security CSRF 的 .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
【发布时间】:2020-05-19 05:36:48
【问题描述】:

我的安全配置有以下一行:

...csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())...

每个请求都会发送一个 csrf cookie 给客户端。此 cookie 没有同站点属性集。是否也可以添加相同站点属性?我查看了该类中的一些方法,据我所知,没有关于额外属性的信息。

如何做到这一点?

【问题讨论】:

    标签: spring-boot spring-security csrf


    【解决方案1】:

    只是插话并遵循 NatFars 的回答,这个解决方案在 Kotlin 中特别简单,您可以委托给其他对象,而不必以 hacky 方式从原始对象复制代码:

    class CookieCsrfTokenRepositoryWrapper(private val repo: CsrfTokenRepository): CsrfTokenRepository by repo {
    
        override fun saveToken(token: CsrfToken?, req: HttpServletRequest?, res: HttpServletResponse?) {
            repo.saveToken(token, req, res)
            res?.getHeaders("Set-Cookie")?.toList()?.forEach {
                if(it.contains("XSRF") && !it.contains("SameSite"))
                    res.setHeader("Set-Cookie", "$it; SameSite=strict")
            }
        }
    }
    
    val repo = CookieCsrfTokenRepositoryWrapper(CookieCsrfTokenRepository.withHttpOnlyFalse())
    

    关于 Kotlin 中的委托:https://kotlinlang.org/docs/reference/delegation.html

    【讨论】:

      【解决方案2】:

      不幸的是,从版本 4.0.1 开始,servlet-api 不允许您将Same-Site 属性添加到Cookie。希望这会很快改变。

      但与此同时,您可以提供自己的 CsrfTokenRepository 实现,而不是将 Cookie 添加到 HttpServletResponse(因此受到 servlet-api 的 cookie 表示的限制),而是直接设置 cookie在 HTTP 标头中:

      public class CustomCsrfTokenRepository implements CsrfTokenRepository {
          // implement other methods...
      
          @Override
          public void saveToken(CsrfToken token, HttpServletRequest request,
                  HttpServletResponse response) {
      
              // some version of this:
              response.setHeader("Set-Cookie", "HttpOnly; SameSite=strict");
          }
      }
      

      你可以看看CookieCsrfTokenRepository来填补空白。

      【讨论】:

        猜你喜欢
        • 2020-07-06
        • 2016-12-21
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        相关资源
        最近更新 更多