Spring Boot 不需要 CSRF 令牌
Posted
技术标签:
【中文标题】Spring Boot 不需要 CSRF 令牌【英文标题】:Spring Boot does not require CSRF token 【发布时间】:2019-12-30 01:15:40 【问题描述】:我有一个 Spring Boot 1.5.12 应用程序,并且默认启用 CSRF 保护。我在提交 POST 请求时使用 CSRF 令牌。
但是,有些 URL 需要通过 GET 请求获取,带有 cookie 信息但不需要 CSRF 令牌,即
<a href="/stuff"><i class="stuff-xs"></i><span>Stuff</span></a>
如何强制我的 Spring Boot 应用程序也需要 CSRF 令牌来处理此类请求?
PS:我有一些关于 GET 请求不需要的 CSRF 保护的 cmets。但是,它也应该受到保护:https://www.acunetix.com/websitesecurity/csrf-attacks/
【问题讨论】:
【参考方案1】:CSRF 的想法是防止修改您未启动的数据。假设 GET 方法不能修改数据,这就是为什么在没有 CSRF 令牌的情况下调用任何 GET URL 是安全的。但是,如果您在 GET 上实现了一些数据更改,那么您应该更改您的逻辑并将其移至 PUT、POST、DELETE 或 PATCH 方法。
【讨论】:
在没有 CSRF 保护的情况下调用任何 GET 方法都是不安全的:acunetix.com/websitesecurity/csrf-attacks 这篇文章说的就是我说的。它们显示了如果您的应用程序“使用 GET 请求处理资金转账”会发生什么。这正是一个人不应该做的。如果您仅在 POST、PUT 等请求上有任何重要逻辑,而在 GET 上没有任何重要逻辑,则使用 CSRF 令牌可以保护您。您不应触发对 GET 请求的任何更改。 Spring不提供token不是问题。 Spring 的开发人员假设您遵循安全设计规则。如果你这样做,没有人可以帮助你。【参考方案2】:如果我正确理解了这个问题,您想发送一个带有 GET 请求的 CSRF 令牌。
但是 GET 或 HEAD HTTP 动词不需要 CSRF 保护。它们对 CSRF 自动免疫。
CSRF 主要是欺骗用户在恶意网页上进行某些活动,然后在原始页面中触发 POST、PUT 或 DELETE 动词来冒充受害者用户。
好消息是,由于同源策略,CSRF 无法读取任何内容。它完全基于利用 POST、PUT 和 DELETE 等不安全的 HTTP 方法。
因此,GET 或 HEAD 动词不需要 CSRF cookie。
【讨论】:
我添加了一个关于 GET 请求的 CSRF 保护的 PS。以上是关于Spring Boot 不需要 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - Spring Security CSRF 保护未在登录页面中注入令牌
spring boot angular csrf令牌握手错误
如何使用 Spring Boot 在 html 元标记中获取 csrf 令牌
带有 JWT auth 和 csrf 令牌的 Spring Boot STATELESS 应用程序