用于ajax调用的spring security csrf保护

Posted

技术标签:

【中文标题】用于ajax调用的spring security csrf保护【英文标题】:spring security csrf protection for ajax calls 【发布时间】:2016-02-10 21:13:16 【问题描述】:

我正在为我的应用程序使用 Spring Security。使用嵌入在表单中的 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 将随请求一起由浏览器自动发送)。来自服务器的响应将包含 csrf 令牌。现在攻击者可以使用这个令牌进行 ajax 调用。这不会造成安全漏洞吗?

如果我遗漏了一些东西来保护这个用例,请提出建议。

【问题讨论】:

【参考方案1】:

不,另一个选项卡中的页面不能只从您的应用请求整个页面。正如*** CORS 页面所说:

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

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

【讨论】:

以上是关于用于ajax调用的spring security csrf保护的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security - Ajax 调用忽略 @ExceptionHandler

ajax 调用无法识别 Spring Security 会话超时

Spring Security CSRF 令牌不适用于 AJAX

Ajax POST 不适用于 spring security csrf,但 GET 方法有效

ajax请求在spring security中被拒绝,Grails

Jersey Spring-Security HTML AJAX 未按预期工作