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

qwe*_*ert 5 ruby-on-rails csrf devise

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

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

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

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

Jea*_*rtz 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 身份验证(后两种安全性较低,但对于小型应用程序来说仍然足够安全)
  • 在对应用程序中的每个值进行操作之前,请始终检查它们