protect_from_forgery - 订单有关系吗?

时间:2017-08-02 00:08:47

标签: ruby-on-rails csrf csrf-protection

我已经阅读了这篇文章https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery/,如果我理解正确的话,默认情况下在Rails 3中如果我们有一个看起来像这样的控制器:

class ApplicationController < ActionController:Base
  protect_from_forgery
end

最终会发生什么(如果是攻击者),会话将被销毁。这意味着如果我们做的事情就是检查用户是否经过身份验证,因为没有会话,它将停止请求。

所以,我的问题是,我相信这一点:

class ApplicationController < ActionController:Base
  protect_from_forgery
  before_action :authenticate_user

  private

  def authenticate_user
    raise NotAuthenticated unless session.key?(:user)
  end
end

是否正确的方式,而不是

class ApplicationController < ActionController:Base
  before_action :authenticate_user
  protect_from_forgery

  private

  def authenticate_user
    raise NotAuthenticated unless session.key?(:user)
  end
end

或者换句话说,protect_from_forgery应该是我们在控制器中做的第一件事。

我的假设是否正确,或者我错过了关于操作顺序如何在控制器中工作的内容?

1 个答案:

答案 0 :(得分:3)

这两种方法的顺序并不重要,没有。

当执行这些方法时,原因与有关:那些是类级别的方法,当Ruby加载文件时,这些方法在类本身的上下文中执行。

查看protect_from_forgery的来源:

def protect_from_forgery(options = {})
  options = options.reverse_merge(prepend: false)

  self.forgery_protection_strategy = protection_method_class(options[:with] || :null_session)
  self.request_forgery_protection_token ||= :authenticity_token
  before_action :verify_authenticity_token, options
  append_after_action :verify_same_origin_request
end

这些基本上是在调用类时将代码添加到类中的宏,这是一种元编程形式。你可以用手动设置这些东西替换类中的方法调用,它也是一样的。

这一切都发生在您的代码首次加载之前,在应用程序启动之前。