将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?

Posted

技术标签:

【中文标题】将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?【英文标题】:Is it safe to include a CSRF token for a REST service as a Http Response Header?将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是否安全? 【发布时间】:2014-03-04 18:45:16 【问题描述】:

我有一组受 CSRF 保护的 REST 服务,使用类似于 OWASP 的同步器令牌模式 (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)。 * REST 使用 Java 和 JAX-RS 实现 * 使用 Spring Security CSRF 令牌实现安全性 * HTTP PUT、POST 和 DELETE 受保护

在我的 Web 应用程序启动时,我在 html 页面中编写了正确的 CSRF 令牌,然后应用程序将令牌作为“X-CSRF-HEADER”包含在每个请求的请求标头中。

我也有直接访问 URL 的客户端(例如 curl 命令行和其他)。

备用客户端需要以某种方式获取 CSRF 令牌(当然是在验证之后)。

将令牌作为 GET 请求的 HTTP 响应标头包含在内是否安全?如果是这样,那么我可以将它包含在响应标头中,并且客户端可以将其读出并将其包含在未来的请求标头中。

这样安全吗?

【问题讨论】:

为什么它比在响应正文中发送更安全或更安全? @JBNizet 我不认为这有什么不同......但我害怕我不知道的东西!也许某处存在 HTTP Header 攻击。 最后,一切都在网上进行。如果使用 SSL,所有内容都会被加密。如果不使用,则不会加密任何内容。 【参考方案1】:

在响应标头中包含 CSRF 令牌通常被认为是安全的。就像请求的主体一样,响应标头在 SSL 响应中被加密,并且不能跨域访问。 CSRF 令牌默认不呈现给响应的原因是为了确保我们延迟创建会话,直到有必要。详情见SEC-2276

【讨论】:

以上是关于将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

springsecurity:使用从 CrossOrigin REST 服务获得的 CSRF 令牌来发布数据

将 csrf 令牌传递给客户端应用程序

REST API 中的 CSRF 令牌

Spring Rest Service - 当我尝试登录时,CSRF 令牌无效

如何将包含 CSRF 令牌的数据从 angularjs 控制器提交到 REST 控制器?

显式打印 CSRF 令牌字段而不是 form_rest(form)?