5

我知道rails默认从rails3提供CSRF保护。但是我的 web 应用程序是一个单页应用程序,所有的通信都依赖于 ajax。

那么,如何在每次调用 ajax 之前从服务器获取 CSRF 令牌?或者我能做的就是取消 CSRF 保护,对吧?

注意:我们不使用任何rails视图来生成网页,甚至是主页,所以在.html或.erb中放置“<%= csrf_meta_tag %>”的解决方案是无效的。我们在一页内使用javascript框架.

我的环境:rails3.2.3、devise2.0.4、dojo1.7.2

4

1 回答 1

4

我建议你看看Rails-backbone项目。特别是backbone_rails_sync.js文件。

它显示了这个 gem 如何将 CSRF 令牌数据连同您向服务器发出的任何 ajax 请求一起发送。

此外,这里是 Django 项目的一些文档,它们为您提供了一个示例,说明如何覆盖默认的 jQuery ajax() 方法以始终发送 CSRF 令牌。

根据评论更新:

所以你问的是如何在只使用 REST API 并且不以任何方式使用视图/表单时实现 CSRF。

答案是:不包括 CSRF 保护

跨站点请求伪造是另一个(恶意)网站复制或模仿请求并伪装成有效用户同时向服务器发送无效数据的一种方式。

仅当用户需要进行身份验证并且身份验证状态保存在缓存中(以在页面视图之间持续存在)时,这才是问题。如果恶意网站劫持了这个缓存,它可以伪装成这个用户来提交数据,而用户和服务器不会注意到这一点。这就是 CSRF 保护所做的事情,它将一个特殊的字符串注入到表单中,该字符串仅对该特定请求有效,并且对于每个其他请求都是唯一的,因此即使会话被劫持,CSRF 保护也可以防止任何修改服务器。

但是,在您的情况下,您正在使用 HTTP API 调用,因此必须通过使用Authorization header. 这样,凭证永远不会被缓存,也不会被劫持,因此不需要 CSRF 保护。

但是,还有其他方法可以确保您的 RESTful API 是安全的:

  • 始终以加密形式通过网络发送数据 (https/ssl)
  • 使用良好的身份验证方法,如 oAuth(2)、API 令牌或基本 HTTP 身份验证(最后两个不太安全,但对于较小的应用程序仍然足够安全)
  • 在对它们进行操作之前,始终检查进入应用程序的每个值
于 2012-06-25T16:17:22.617 回答