2013-08-22 38 views
12

我一直在使用REST API开发Rails应用程序,以便从移动应用程序访问。如何确保从CSRF保护Rails API?

它工作得很好。当用户从移动应用程序登录时,他获得了他在未来对API的请求中使用的auth_token。问题在于,通过转到path/api/v1/...也可以从web访问API,因此,它必须受到CSRF的保护。

我有BaseApiController类继承自ApplicationControllerprotect_from_forgery“启用”。这里的例子:

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

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    # ... 
end 

现在,当我做非GET请求我的API,与auth_token,我的请求被成功完成,但在日志中我可以看到著名的WARNING: Can't verify CSRF token authenticity。如果我从BaseApiController中删除protect_from_forgery,我没有收到任何警告(很明显),但是我的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 

更多关于项目的详细信息:Rails的3.2.14,设计, AngularJS。该项目的源代码可以在here找到。

回答

8

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

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

但是,有人评论说可以使用各种基于Flash和基于Java的方法提交CSRF。我相信,在轨而回用于安全修补程序的原因:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

在任何情况下,很好地解决实际检查的真实性令牌可以在这里找到:WARNING: Can't verify CSRF token authenticity rails

它涉及到在实际设置请求中的标题。

祝你好运!