如何确保从CSRF保护Rails API?

时间:2013-08-22 11:17:12

标签: ruby-on-rails ruby-on-rails-3 api csrf

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

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

我有ApplicationController类继承自protect_from_forgery&#34;已启用&#34;的class Api::V1::BaseApiController < ApplicationController # ... end class ApplicationController < ActionController::Base protect_from_forgery # ... end 。这是一个例子:

auth_token

现在,当我使用WARNING: Can't verify CSRF token authenticity对我的API发出非GET请求时,我的请求已成功完成,但在日志中我可以看到着名的protect_from_forgery。如果我从BaseApiController中移除protect_from_forgery,我就不会收到任何警告(显然),但我的API很容易受到CSRF攻击(我制作了一个简单的HTML表单,成功更改了数据当没有class Api::V1::BaseApiController < ApplicationController # ... def verified_request? super || User.where(authentication_token: params['auth_token']).count > 0 end end )时,跨域名。

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

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

{{1}}

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

1 个答案:

答案 0 :(得分:8)

你可能会看到人们认为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/

无论如何,可以在此处找到实际检查真实性令牌的好解决方案:WARNING: Can't verify CSRF token authenticity rails

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

祝你好运!