如何确保从CSRF保护Rails API?

Vik*_*nic 12 api ruby-on-rails csrf ruby-on-rails-3

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

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

我有BaseApiController继承自" ApplicationControllerprotect_from_forgery启用"的类.这是一个例子:

class Api::V1::BaseApiController < ApplicationController
  # ...
end

class ApplicationController < ActionController::Base
  protect_from_forgery
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

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

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

class Api::V1::BaseApiController < ApplicationController
  # ...
  def verified_request?
    super || User.where(authentication_token: params['auth_token']).count > 0
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Tyl*_*ler 8

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

skip_before_filter :verify_authenticity_token, :only => [:your_method]
Run Code Online (Sandbox Code Playgroud)

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

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

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

祝好运!