Vraag protect_from_forgery met:: uitzondering waar?


Hoe werkt het protect_from_forgery with: :exception werk?

Ik wil de code graag bewerken om ernaar te kijken en ervan te leren. Ik kan echter niet vinden waar het is geplaatst als op een hoger niveau van abstractie.


15
2017-10-22 17:40


oorsprong


antwoorden:


Je kunt het hier vinden op Github: https://github.com/rails/rails/blob/c60be72c5243c21303b067c9c5cc398111cf48c8/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L88

def protect_from_forgery(options = {})
  self.forgery_protection_strategy = protection_method_class(options[:with] || :null_session)
  self.request_forgery_protection_token ||= :authenticity_token
  prepend_before_action :verify_authenticity_token, options
end

De with: :exception wordt doorgegeven aan protection_method_class(:exception). Wat doet:

def protection_method_class(name)
  ActionController::RequestForgeryProtection::ProtectionMethods.const_get(name.to_s.classify)
  rescue NameError
  raise ArgumentError, 'Invalid request forgery protection method, use :null_session, :exception, or :reset_session'
end

Dan dit ActionController::RequestForgeryProtection::ProtectionMethods.const_get(name.to_s.classify). name.to_s.classify hier zal zijn Exception.

Dan kun je vinden:

module ProtectionMethods
  class Exception
    def initialize(controller)
      @controller = controller
    end

    def handle_unverified_request
      raise ActionController::InvalidAuthenticityToken
    end
  end
end

Dit alles bepaalt de manier waarop de ongeldige authenticiteit zal worden afgehandeld. Daarna stelt het een before_action: :verify_authenticity_token.

def verify_authenticity_token
  unless verified_request?
    logger.warn "Can't verify CSRF token authenticity" if logger
    handle_unverified_request
  end
end

Welke de eerder gedefinieerde strategie gebruikt:

def handle_unverified_request
  forgery_protection_strategy.new(self).handle_unverified_request
end

De uitzondering verhogen zoals gedefinieerd in Exception.


11
2017-10-22 17:55