【问题标题】:Override the protect_from_forgery strategy in a controller覆盖控制器中的protect_from_forgery 策略
【发布时间】:2014-07-03 14:15:12
【问题描述】:

我想使用两种不同的protect_from_forgery 策略构建一个rails 应用程序:一种用于Web 应用程序,一种用于API。

在我的应用程序控制器中,我有这行代码:protect_from_forgery with: :exception 为了防止 CSRF 攻击,它工作得很好。

在我的 API 命名空间中,我创建了一个继承自我的应用程序控制器的 api_controller,它是 API 命名空间中所有其他控制器的父类,我将上面的代码更改为:protect_from_forgery with: :null_session

很遗憾,我在尝试发出 POST 请求时出错:“无法验证 CSRF 令牌的真实性”。

我不想在我的 API 控制器中跳过 verify_authenticity_token 方法,我只想在我的应用程序中有两个不同的策略,那么如何覆盖我的应用程序控制器中定义的protect_from_forgery 策略?

编辑:好的,所以我最终做了我一开始不想做的事情:更改我的 api_controller 的继承:它现在从 ActionController::Base 继承,而不是从我的应用程序控制器。它现在可以工作了,但是:

  1. 它没有回答我的问题,即覆盖protect_from_forgery 策略。
  2. 它不是 DRY,因为我必须复制/粘贴以前在 application_controller 中的内容。

因此,如果有人有真正的方法来覆盖此方法,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby overriding csrf


    【解决方案1】:

    我正在运行一个具有类似结构的应用程序 - Web App + API。我这样解决了 CSRF 问题:

    • 仅对非 API 请求应用protect_from_forgery
    • 我的 API 端点是 api.example.com,所以我使用子域约束来区分 API 和 Web 应用请求

    代码:

    class ApplicationController < ActionController::Base
    
      protect_from_forgery with: :exception, if: :isWebRequest?
    
      def isWebRequest?
        request.subdomains[-1] != 'api'
      end
    
    end
    

    【讨论】:

    • 好吧,我喜欢子域技巧,我不知道,但现在你的整个“api”子域没有受到 CSRF 真实性令牌的保护,是吗?最后和添加'skip_before_filter :verify_authenticity_token'一样,不是吗?
    • 为什么 API 调用需要 CSRF 真实性令牌?这仅适用于基于表单的提交。
    • 查看这个问题的答案:[stackoverflow.com/questions/18378902/….
    【解决方案2】:

    如果您将 protect_from_forgery with: :exception 保留在应用程序控制器中,但随后将以下内容放入您的 API 控制器中会怎样?

    skip_before_action :protect_from_forgery
    protect_from_forgery with: :null_session
    

    这样,您仍然可以为 Web 应用程序中的所有控制器获得标准的 CSRF 攻击保护,但您的 API 方法也会获得空会话行为。

    【讨论】:

      【解决方案3】:

      聚会迟到了,但可以这样做:

      class YourCustomStrategy
        def initialize(controller)
        end
      
        def handle_request
        end
      end
      

      在你的 ApplicationController 或你想要的地方:

      class ApplicationController < ActionController::Base
       protect_from_forgery with: YourCustomStrategy
      end
      

      【讨论】:

      • s/handle_request/handle_unverified_request/
      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2011-06-19
      • 1970-01-01
      • 2021-11-16
      • 2018-02-05
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多