spring如何使用_csrf参数或X-CSRF-TOKEN标头在内部验证csrf令牌?

时间:2018-08-29 01:25:38

标签: java spring spring-boot spring-security csrf

我正在使用spring并通过HttpSessionCsrfTokenRepository启用了csrf,我清楚地知道客户端是否以_csrf参数或X-CSRF-TOKEN标头的形式发送csrf令牌,spring会选择该令牌并使用该令牌进行验证使用generateToken(HttpServletRequest request)生成 但是我的问题是spring如何在内部做到这一点。 我对此问题的理由是:

1。我有一个Rest POST呼叫,该呼叫需要凭证并验证     用户的身份。但是由于我想将csrf令牌添加到     休息电话作为安全层,我想在帖子正文中添加它     以防止csrf令牌泄漏。

因此,如果我知道Spring Security如何在内部过滤这些令牌,将很有帮助。我修订了Spring文档,但这主要是我们如何在具有隐藏字段或元标记以及带有标头的Ajax调用的形式中使用CSRF令牌。

如果将令牌放在主体中也是一件好事,我也想听听我的设计意见(我坚信,因为这不是泄漏令牌的简单url参数),还是我应该将其放入标头。我只是不想仅仅因为它简单而倾向于使用头文件。寻找最佳解决方案。

请阐明一下。

1 个答案:

答案 0 :(得分:1)

如果您想研究一下CsrfTokenRepository在春季有多种实现方式。例如:

https://github.com/rwinch/spring-security/blob/master/web/src/main/java/org/springframework/security/web/csrf/HttpSessionCsrfTokenRepository.java

https://github.com/rwinch/spring-security/blob/master/web/src/main/java/org/springframework/security/web/csrf/CsrfFilter.java

https://github.com/rwinch/spring-security/tree/master/web/src/main/java/org/springframework/security/web/csrf

https://docs.spring.io/spring-security/site/docs/4.2.7.RELEASE/apidocs/org/springframework/security/web/csrf/CookieCsrfTokenRepository.html

https://docs.spring.io/spring-security/site/docs/4.2.7.RELEASE/apidocs/org/springframework/security/web/csrf/CookieCsrfTokenRepository.html

IMO出于很好的理由(更安全-可能是?)将令牌保留在标头上,因为我想到的原因很少。

  1. 您不能在主体上为GET请求设置令牌。您希望与所有端点保持一致(今天可能不需要,但是情况变化很快)

  2. 明天,如果您想更改Auth模型,则不想更改请求正文。当请求正文更改时,您会与客户违约

  3. 如果将身份验证模型更改为授权服务器,则可以在服务之前添加代理服务器(例如ngnix?),并命名为auth-proxy。您可以将所有与安全相关的内容留给此auth-proxy,它将检查标头并为您进行验证。您不希望代理调查您的请求正文,而是可以专注于业务实现

  4. 请求主体与您的业务完全相关,因此您可以专注于它而不是处理与您身体中与安全相关的事情。
  5. 每次为新端点创建一个新请求时,您都不想一直在所有请求中添加令牌

根据我的经验,这只是我的看法。