如何确保 Rails API 不受 CSRF 的影响?
Posted
技术标签:
【中文标题】如何确保 Rails API 不受 CSRF 的影响?【英文标题】:How to make sure Rails API is secured from CSRF? 【发布时间】:2013-08-25 02:13:28 【问题描述】:我一直在使用 REST API 开发 Rails 应用程序,以便从移动应用程序访问。
效果很好。当用户从移动应用程序登录时,他会得到auth_token
,他将在未来对 API 的请求中使用它。问题是 API 也可以通过访问路径 /api/v1/... 从 Web 访问,因此,它必须受到 CSRF 的保护。
我有 BaseApiController
类继承自 ApplicationController
具有 protect_from_forgery
“启用”。示例如下:
class Api::V1::BaseApiController < ApplicationController
# ...
end
class ApplicationController < ActionController::Base
protect_from_forgery
# ...
end
现在,当我使用 auth_token
向我的 API 发出非 GET 请求时,我的请求成功完成,但在日志中我可以看到著名的 WARNING: Can't verify CSRF token authenticity
。如果我从BaseApiController
中删除protect_from_forgery
,我不会收到任何警告(显然),但是我的API 容易受到CSRF 攻击(我制作了一个简单的html 表单,当没有@ 时成功地跨域更改数据987654331@).
我的问题是:如何确保我的 API 保持安全,同时在执行非 GET 请求时消除警告?
这是我想出的解决方案之一,但它看起来更像是一种 hack 并执行一个额外的数据库查询:
class Api::V1::BaseApiController < ApplicationController
# ...
def verified_request?
super || User.where(authentication_token: params['auth_token']).count > 0
end
end
有关该项目的更多详细信息:Rails 3.2.14、Devise、AngularJS。该项目的源代码可以在here找到。
【问题讨论】:
【参考方案1】:您可能会看到人们认为 CSRF 不是 API 请求的问题(一开始没有状态,那么有什么可以劫持的呢?),因此有些人建议以下内容来简单地消除警告:
skip_before_filter :verify_authenticity_token, :only => [:your_method]
但是,有一些评论说可以使用各种基于 Flash 和 Java 的方法提交带有 text/plain
的 CSRF。我相信这就是 Rails 中安全补丁的原因:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/
无论如何,可以在此处找到实际检查真实性令牌的良好解决方案:WARNING: Can't verify CSRF token authenticity rails
这涉及在您的请求中实际设置标头。
祝你好运!
【讨论】:
以上是关于如何确保 Rails API 不受 CSRF 的影响?的主要内容,如果未能解决你的问题,请参考以下文章