春季安全 CSRF CORS

Posted

技术标签:

【中文标题】春季安全 CSRF CORS【英文标题】:Spring security CSRF CORS 【发布时间】:2015-07-25 16:59:34 【问题描述】:

问题说明:我有一些使用 Spring Security 进行 CSRF 保护的 RESTful API。此外,这些 API 将由 Angular WEB UI 从不同的来源/域访问。我不需要 Spring 身份验证,因为身份验证由 Siteminder 处理。

方法: 我从 Dave Syer 获得了 CSRF 保护的链接:The Login Page: Angular JS and Spring Security Part II,除了一个问题(下)外,它运行良好。

问题:当我的 Angular html 客户端访问同一源/域上的 RESTful API 时,此代码可以正常工作;但是当我尝试从不同的来源访问相同的 API 时,收到错误 403 - Access Forbidden - CSRF token error。

到目前为止我通过扩展您的示例尝试的方法:

    添加了一个 CORS 过滤器 - Enabling Cross Origin Requests for a RESTful Web Service

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
    

上面没有运气。

请建议我是否需要做其他事情才能使其正常工作。

谢谢, 苏曼

【问题讨论】:

【参考方案1】:

CSRF 和 CORS 不是一回事。您现在可能已经对 CORS 部分进行了排序,但是您需要将 CSRF 令牌添加到任何 POST/PUT/DELETE 请求中。 Spring Security 在您引用的博客系列的标题中发送令牌,Angular 从那里获取它(您需要添加几行代码才能使其正常工作)。

【讨论】:

非常感谢@Dave Syer!从这里为客户端添加几行角度代码后它起作用了:[链接]github.com/pasupulaphani/angular-csrf-cross-domain。此外,在 CORS 过滤器中添加了 Access-Control-Allow-Headers:origin, content-type , X-CSRF-TOKEN 以便从不同的来源进行访问。访问控制请求方法:POST 您能否发布您添加到 angularjs 应用程序以使其运行的内容?谢谢! 查看代码:github.com/dsyer/spring-security-angular/blob/master/single/src/…

以上是关于春季安全 CSRF CORS的主要内容,如果未能解决你的问题,请参考以下文章

关于安全性问题:(XSS,csrf,cors,jsonp,同源策略)

CSRF 保护如何为我提供比 CORS 控制更高的安全性(前端/后端位于两个不同的域)?

CSRF 保护 - JWT 和 CORS 白名单组合是不是足够?

web安全

Springs CSRF 保护 HTML *only* 登录页面

CORS 和 CSRF 处理 checkMarx XSRF 攻击问题(spring boot 微服务)