如何使用 Spring RESTful Web 服务处理 CSRF 保护?

Posted

技术标签:

【中文标题】如何使用 Spring RESTful Web 服务处理 CSRF 保护?【英文标题】:How to handle CSRF protection with Spring RESTful web services? 【发布时间】:2016-01-12 13:22:38 【问题描述】:

我有一个启用 CSRF 保护的 Spring Web 应用程序。我可以通过 AJAX 调用访问 RESTful 服务,但是当我使用 httpurlconnection 等其他应用程序访问该服务时,我收到 401 错误(CSRF 令牌为空)。

我知道要访问 RESTful 服务,我需要在请求标头中传递一个令牌,但我怎样才能获得 CSRF 令牌?

【问题讨论】:

【参考方案1】:

您可以在 Spring MVC 中创建一个获取 CSRF 令牌的映射:

@RequestMapping(value="/csrf-token", method=RequestMethod.GET)
public @ResponseBody String getCsrfToken(HttpServletRequest request) 
    CsrfToken token = (CsrfToken)request.getAttribute(CsrfToken.class.getName());
    return token.getToken();

【讨论】:

我将它添加到我的 Spring 后端,我可以得到一个 csrf-token。现在的问题是......我如何将它传递回我的 Spring POST/PUT web 服务?我宁愿不将我的 JSON 数据的这一部分发回。我非常乐意将令牌放在请求头中或作为 cookie 的一部分。 @tjholmes66 您可以在名为X-CSRF-TOKEN 的标头中发送令牌。 是的。谢谢。我现在想通了。谢谢! 我相信您的回答基本上破坏了 CSRF 保护。它使攻击者可以通过执行 get 请求随意获取 CSRF 令牌。 @UMad 只要执行同源策略应该没问题。

以上是关于如何使用 Spring RESTful Web 服务处理 CSRF 保护?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 安全性和 Restful Web 服务验证数据库中的凭据?

如何在我的 Spring 4.0 RestFul Web 服务上实现 Spring Security?

如何保护 Angular.js 或 Ember.js 的 Spring RESTful Web 服务

如何在 Spring Boot 中同时公开 SOAP Web 服务和 RESTful API?

使用 Spring Boot Actuator 构建 RESTful Web 服务

Spring Restful Web 服务的安全性