弹簧安全csrf保护ajax调用

时间:2015-11-10 03:35:55

标签: jquery ajax spring cookies spring-security

我正在为我的应用程序使用spring security。在表单中嵌入基于表单的auth w / csrf标记。用户通过身份验证后,会话cookie允许访问页面。 我需要在我的应用程序中针对ajax调用防止csrf。

Spring提供了一种可以将令牌从服务器发送到客户端的方法

<head>
    <meta name="_csrf" content="${_csrf.token}"/>
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <!-- ... -->
</head>

需要将此令牌发回以进行ajax调用。

var client = rest.chain(csrf, {
token: $("meta[name='_csrf']").attr("content"),
name: $("meta[name='_csrf_header']").attr("content")
});

http://docs.spring.io/spring-security/site/docs/4.0.2.RELEASE/reference/htmlsingle/#csrf-include-csrf-token-ajax

问:可能的攻击者(另一个浏览器选项卡中的HTML代码)仍然可以从我的应用程序请求整个页面(这将起到会话cookie的作用,因为会话cookie将随浏览器自动发送)。来自服务器的响应将包含csrf令牌。现在,攻击者可以使用此令牌进行ajax调用。这不会造成安全漏洞吗?

请提示我是否遗漏了一些可以防范此用例的内容。

1 个答案:

答案 0 :(得分:0)

不,另一个标签页中的页面不能仅从您的应用中请求整个页面。正如维基百科CORS页面所说:

  

默认情况下,“跨域”AJAX请求是被禁止的   能够执行高级请求(POST,PUT,DELETE等)   HTTP请求的类型,以及指定自定义HTTP标头)   这会引入许多跨站点脚本安全问题。

如果您的应用明确发送CORS标头,则必须格外小心。否则你应该对此事安全。