【问题标题】:Disable CSRF SiteWide禁用 CSRF 站点范围
【发布时间】:2014-12-10 20:47:27
【问题描述】:

有没有办法为所有控制器禁用 CSRF,还是必须在每个控制器的基础上禁用它?我只使用 ruby​​ on rails 作为 API,不需要任何类型的 CSRF,因为请求不是基于会话的。我只想禁用 JSON 请求。

我相信这可能有效,但不确定

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

#Checks format for json
protected
  def json_request?
    request.format.json?
  end

end

【问题讨论】:

  • 这与在单个控制器中禁用它相同,但您应该在 ApplicationController 中执行此操作。
  • @tadman 有没有办法只为 json 请求指定?我是 ruby​​ on rails 的新手,所以学习我的使用方法。
  • 设置一个控制器作为所有 API 调用的基础,在此处禁用它,然后从该中间类派生所有 API 控制器。同样的方法适用。使该控制器仅 JSON。这是在 Rails 中最传统的方式。
  • @tadman 我的问题与您标记为重复的问题不同。我想为所有控制器禁用仅 json 请求。另外,上面的代码是功能性答案吗?如果是这样,它与您建议的解决方案相比如何?
  • 如果有人有更具体的答案,我会重新打开它,但我认为你所拥有的应该可以完成这项工作。唯一确定的方法是在您的环境中验证它。

标签: ruby-on-rails ruby csrf


【解决方案1】:

与 Rails 中的许多东西一样,禁用基本控制器中的某些东西会在所有派生的控制器中禁用它。要完全关闭 CSRF,请在 ApplicationController 中禁用它:

skip_forgery_protection

这是an alias for

skip_before_action :verify_authenticity_token

skip_before_action 方法确实具有自定义其应用方式的选项,因此您可以缩小关注范围:

skip_before_action :verify_authenticity_token, unless: csrf_required?

正如您所展示的,您可以定义一种方法来限制它。如果该方法返回true,则该操作照常执行,否则将被跳过。

在编写 API 时,通常会将 API::BaseController 之类的东西用作中间控制器,这样您就可以将基于会话的活动与基于 API 的活动分开。例如:

class API::BaseController < ApplicationController
  skip_before_action :verify_authenticity_token
end

然后从该控制器派生所有特定于 API 的控制器。即使在主要由 API 驱动的应用程序中,您也可能需要一个带有表单提交的传统“注册”页面,或者一个能够编辑和更新内容的管理区域。

我发现的一个选项是在提供 API 密钥的情况下禁用 CSRF 保护。例如:

def csrf_required?
  params[:api_key].blank?
end

这意味着您仍然可以接受传统的“表单编码”或 XML API 调用。如果您的 API 密钥是通过标头提供的,则根据某些要求,您可以对其进行调整以针对 request 进行相应的测试。

【讨论】:

  • Google 员工注意到,使用底部的 csrf_required? 方法,您的非 API 操作将容易受到 CSRF 的攻击。攻击者只需在 POST url 中添加?api_key=x 并为调用禁用 CSRF 检查。
  • @GaborLengyel 大概您会针对 CSRF 令牌 API 密钥进行验证,并且如果 API 密钥验证失败,您不会让它们通过。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2012-06-26
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多