禁用 CSRF SiteWide

2023-12-30

有没有办法为所有控制器禁用 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

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

skip_forgery_protection

This is 的别名 https://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html:

skip_before_action :verify_authenticity_token

The skip_before_action http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-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因此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禁用 CSRF SiteWide 的相关文章

随机推荐