java - spring如何在内部使用_csrf参数或X-CSRF-TOKEN header 验证csrf token ?

标签 java spring spring-boot spring-security csrf

我正在使用 spring 并通过 HttpSessionCsrfTokenRepository 启用 csrf,我清楚地知道客户端是否将 csrf token 作为请求的 _csrf 参数或 X-CSRF-TOKEN header 发送,spring 拾取 token 并使用 token 进行验证使用generateToken(HttpServletRequest request)生成 但我的问题是 spring 在内部是如何做到这一点的。 我提出这个问题的原因是:

1.我有一个 Rest POST 调用,它获取凭据并验证 用户的身份。但是因为我想添加一个 csrf token 休息调用作为安全层我想将其添加到帖子正文中 以防止 csrf token 泄漏。

因此,如果我知道 spring security 如何在内部过滤这些 token ,那将会很有帮助。我修改了 spring 文档,但这主要是我们如何在带有隐藏字段或元标记的表单中使用 CSRF token 以及带有 header 的 Ajax 调用。

而且我也想听到对我的设计的任何评论,如果将 token 放在 body 中是好的(我确信它不是一个简单的 url 参数来泄漏 token ),或者我应该将它放在 header 。我只是不想仅仅因为它简单就倾向于使用 header 。寻找最佳解决方案。

请透露一些信息。

最佳答案

如果您想研究一下,Spring 中 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 将 token 保留在标题上很好(更安全 - 可能是?),因为我能想到的几个原因..

  1. 您无法在 GET 请求的正文上设置 token 。您希望所有端点保持一致(您今天可能不需要它,但事情变化得很快)

  2. 明天如果您想更改您的身份验证模型,您不想更改您的请求正文。当请求正文发生更改时,您就违反了与客户的契约(Contract)

  3. 如果你将你的认证模型改为授权服务器,你可以在你的服务之前添加代理服务器(比如ngnix?),我们称之为auth-proxy。您可以将所有与安全相关的事情留给此身份验证代理,它会检查 header 并为您进行验证。您不希望代理查看您的请求正文,您可以专注于业务实现

  4. 请求正文与您的业务完全相关,因此您可以专注于它,而不是处理正文中与安全相关的事务。
  5. 每次为新端点创建新请求时,您都不希望在所有请求中继续添加 token

这只是我根据我的经验得出的意见。

关于java - spring如何在内部使用_csrf参数或X-CSRF-TOKEN header 验证csrf token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52068250/

相关文章:

java - "Throwable"应该被抛出吗?

java - Android SharedPreferences 来自 fragment 中的 onclick

java - 是否可以创建我自己的自定义注释来充当 Spring @Controller 注释?

java - 如何在 Eclipse 中配置代码格式化程序以在枚举中的每个元素之后添加新行?

java - 在 unix 中文件更改时触发进程

java - 如何避免在测试期间调用 spring AOP 切面

java - 悲观锁定因 ObjectOptimisticLockingFailureException 而失败

spring - 带有 spring-data solr 的嵌套文档

docker - Docker 容器中的 Spring Boot 应用程序和主机中的 MySQL

angularjs - 托管在 Pivotal Web 服务中的 Spring RESTful 没有 'Access-Control-Allow-Origin' 错误