如何保护浏览器使用CSRF攻击的RESTful API?

lvh*_*lvh 12 javascript security rest

我正在为一组网站设计API.这些站点非常相似(有点像StackOverflow,SuperUser和ServerFault),它们有一个共享的后端是有意义的.因此,我们决定尝试使用一个漂亮的REST API作为后端,以及一堆非常相似但不同的前端消耗所述API.前端应该最好都是静态的,但如果结果是不可能的话,这并不是一个很难的要求.

我现在正在设计该API,我担心安全问题,特别是CSRF.根据我对CSRF攻击的基本了解,它们包含两个重要组成部分:

  1. 能够命名资源和请求正文.

  2. 欺骗用户/浏览器使用环境身份验证(如会话)向看起来经过身份验证的资源发出请求.

许多修复CSRF攻击的经典方法都是基于会话.由于我的REST API并不真正进行会话,这既可以防止很多向量,也可以防止所有修复它们的方法.例如,双重提交没有意义,因为没有什么可以双重提交.

我最初的方法涉及攻击CSRF攻击的第2部分.如果我验证所有请求(例如使用HTTP Basic Auth),并且浏览器没有保存这些凭证(例如某些JS发出请求),只有拥有凭据的JS可以发出请求,我们就完成了.明显的缺点是应用程序需要知道用户的凭据.另一个稍微不那么明显的缺点是,如果我想在API端安全地存储凭证,那么验证密码应该花费一个固定的,非平凡的时间.如果安全地验证密码需要100毫秒,那么每个其他请求将花费至少100毫秒+ eps,并且它将需要一些非常聪明的客户端技巧来使这感觉不慢.我可能能够缓存它(因为凭证将始终是相同的),如果我非常小心,我可能设法做到这一点,而不会引入时间漏洞,但这听起来像一个大黄蜂的巢.

OAuth 2.0似乎有点过头了,但我想它毕竟可能是最好的解决方案,以免我最终执行得不好.我想我现在可以做HTTP Basic Auth的事情,当我们有第三方应用程序开发人员时,我会转到OAuth.

与OAuth有一点阻抗不匹配.OAuth真的想帮助应用程序访问另一个应用程序上的东西,基本上.我希望用户在这样的帐户存在之前注册其中一个前端.

我还考虑通过使URL随机化来攻击点1 - 即将标记添加到查询字符串中.这肯定会起作用,并且它非常接近于表单中传统的随机令牌如何工作,并且鉴于HATEOAS它甚至应该相当RESTful,尽管这提出了两个问题:1)你从哪里开始?是否存在使用HTTP Basic Auth登录的强制API起点?2)如果他们无法预先预测URL,那么它会让应用程序开发人员满意多少,HATEOAS会被诅咒?

我已经看到如何在RESTful应用程序中阻止CSRF?,但我不同意随机URI必然是不可靠的前提.此外,这个问题并没有真正令人满意的答案,也没有提到OAuth.此外,会话双提交解决方案无效,正如我上面提到的(静态前端的不同域比API端点).

我意识到我从根本上试图在这里做的是尝试允许来自一个域的跨站点请求而不允许它们从另一个域中进行,这并不容易.当然必须有一些合理的解决方案吗?

小智 0

答案取决于您需要支持什么。如果我们假设您想要支持使用REST 服务的 Web 应用程序,并对 API 使用相同的 REST 服务,而该 API 与恰好是 RESTFUL 的 Web 应用程序不同(您可能会决定“会话”用于你! )。

现在(/me 相当累)我认为您建议使用 javascript 和 HTTP Basic Auth 的方式是一个好的开始。