如何使用 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?