如何在Spring RESTful web服务中处理CSRF保护?

13
我有一个启用了CSRF保护的Spring网络应用程序。 我可以通过AJAX调用访问RESTful服务,但是当我使用其他应用程序(如httpurlconnection)访问服务时,我会收到401错误(CSRF令牌为空)。我知道要访问RESTful服务,需要在请求头中传递令牌,但是我该如何获取CSRF令牌?
1个回答

26

您可以在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();
}

1
我将这个功能添加到我的Spring后端,现在可以获取csrf-token。现在的问题是...我该如何将其传递回我的Spring POST/PUT Web服务?我不想将其作为JSON数据发送回去的一部分。我更愿意将令牌放在请求的标头或cookie中。 - tjholmes66
1
@tjholmes66 您可以将令牌发送到名为 X-CSRF-TOKEN 的标头中。 - holmis83
是的。谢谢。我现在想通了。谢谢! - tjholmes66
1
我认为你的回答基本上破坏了CSRF保护。它使攻击者能够通过执行GET请求随意获取CSRF令牌。 - RokL
1
只要实施同源策略,就应该没问题。 - holmis83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接