如何确保从CSRF保护Rails API?

我一直在使用REST API开发Rails应用程序,以便从移动应用程序进行访问。

它运作得很好。 当用户从移动应用程序登录时,他获得了auth_token ,这是他在将来对API的请求中使用的。 问题是,通过转到路径/ api / v1 / …也可以从Web访问API,因此必须保护它不受CSRF的影响。

我有BaseApiController类,它inheritance自ApplicationController ,其中protect_from_forgery “enabled”。 这是一个例子:

 class Api::V1::BaseApiController < ApplicationController # ... end class ApplicationController < ActionController::Base protect_from_forgery # ... end 

现在,当我使用auth_token对我的API auth_token非GET请求时,我的请求成功完成,但在日志中我可以看到着名的WARNING: Can't verify CSRF token authenticity 。 如果我从我的BaseApiController删除protect_from_forgery ,我没有得到任何警告(显然),但是我的API容易受到CSRF攻击(我做了一个简单的HTML表单,当没有protect_from_forgery时成功地跨域更改数据)。

我的问题是:如何确保我的API保持安全,但在执行非GET请求时也会删除警告?

这是我提出的解决方案之一,但它看起来更像是一个黑客并执行一个额外的数据库查询:

 class Api::V1::BaseApiController  0 end end 

关于该项目的更多细节:Rails 3.2.14,Devise,AngularJS。 该项目的源代码可以在这里找到。

您可能会看到人们建议CSRF不是API请求的问题(没有状态可以开始,所以有什么可以劫持?),所以有人建议以下内容简单地消除警告:

 skip_before_filter :verify_authenticity_token, :only => [:your_method] 

但是,有一些评论认为可以使用各种Flash和基于Java的方法使用text/plain提交CSRF。 我相信这就是导轨安全补丁的原因: http : //weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

无论如何,可以在此处找到实际检查真实性令牌的好解决方案: 警告:无法validationCSRF令牌真实性rails

它涉及在您的请求中实际设置标头。

祝好运!