我一直在使用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。
答案 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
它涉及在请求中实际设置标题。
祝你好运!