如何在发送Restful POST / PUT API之前使用rails3.2.x获取CSRF令牌,而没有来自服务器端的任何表单/ UI?

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

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

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

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

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

它显示了此gem如何将CSRF令牌数据与您对服务器发出的任何ajax请求一起发送。

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

根据评论更新:

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

答案是: 不包括CSRF保护

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

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

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

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

  • 始终以加密forms通过网络发送数据(https / ssl)
  • 使用良好的身份validation方法,如oAuth(2),API令牌或基本HTTP身份validation(后两个安全性较低,但对于较小的应用程序仍然足够安全)
  • 在对其进行操作之前,请务必检查进入应用程序的每个值