将 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 令牌来发布数据
Spring Rest Service - 当我尝试登录时,CSRF 令牌无效