123456789_123456789_123456789_123456789_123456789_

Module: ActionController::RequestForgeryProtection::ClassMethods

Instance Method Summary

Instance Method Details

#is_storage_strategy?(object) ⇒ Boolean (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/request_forgery_protection.rb', line 228

def is_storage_strategy?(object)
  object.respond_to?(:fetch) && object.respond_to?(:store) && object.respond_to?(:reset)
end

#protect_from_forgery(options = {})

Turn on request forgery protection. Bear in mind that GET and HEAD requests are not checked.

class ApplicationController < ActionController::Base
  protect_from_forgery
end

class FooController < ApplicationController
  protect_from_forgery except: :index
end

You can disable forgery protection on a controller using skip_forgery_protection:

class BarController < ApplicationController
  skip_forgery_protection
end

Valid Options:

  • :only / :except - Only apply forgery protection to a subset of actions. For example only: [ :create, :create_all ].

  • :if / :unless - Turn off the forgery protection entirely depending on the passed Proc or method reference.

  • :prepend - By default, the verification of the authentication token will be added at the position of the protect_from_forgery call in your application. This means any callbacks added before are run first. This is useful when you want your forgery protection to depend on other callbacks, like authentication methods (Oauth vs Cookie auth).

    If you need to add verification to the beginning of the callback chain, use prepend: true.

  • :with - Set the method to handle unverified request. Note if default_protect_from_forgery is true, Rails call protect_from_forgery with with :exception.

Built-in unverified request handling methods are:

  • :exception - Raises ::ActionController::InvalidAuthenticityToken exception.

  • :reset_session - Resets the session.

  • :null_session - Provides an empty session during request but doesn’t reset it completely. Used as default if :with option is not specified.

You can also implement custom strategy classes for unverified request handling:

class CustomStrategy
  def initialize(controller)
    @controller = controller
  end

  def handle_unverified_request
    # Custom behavior for unverfied request
  end
end

class ApplicationController < ActionController::Base
  protect_from_forgery with: CustomStrategy
end
  • :store - Set the strategy to store and retrieve CSRF tokens.

Built-in session token strategies are:

  • :session - Store the CSRF token in the session. Used as default if :store option is not specified.

  • :cookie - Store the CSRF token in an encrypted cookie.

You can also implement custom strategy classes for CSRF token storage:

class CustomStore
  def fetch(request)
    # Return the token from a custom location
  end

  def store(request, csrf_token)
    # Store the token in a custom location
  end

  def reset(request)
    # Delete the stored session token
  end
end

class ApplicationController < ActionController::Base
  protect_from_forgery store: CustomStore.new
end
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/request_forgery_protection.rb', line 179

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

  self.csrf_token_storage_strategy = storage_strategy(options[:store] || SessionStore.new)

  before_action :verify_authenticity_token, options
  append_after_action :verify_same_origin_request
end

#protection_method_class(name) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/request_forgery_protection.rb', line 201

def protection_method_class(name)
  case name
  when :null_session
    ProtectionMethods::NullSession
  when :reset_session
    ProtectionMethods::ResetSession
  when :exception
    ProtectionMethods::Exception
  when Class
    name
  else
    raise ArgumentError, "Invalid request forgery protection method, use :null_session, :exception, :reset_session, or a custom forgery protection class."
  end
end

#skip_forgery_protection(options = {})

Turn off request forgery protection. This is a wrapper for:

skip_before_action :verify_authenticity_token

See skip_before_action for allowed options.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/request_forgery_protection.rb', line 196

def skip_forgery_protection(options = {})
  skip_before_action :verify_authenticity_token, options.reverse_merge(raise: false)
end

#storage_strategy(name) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/request_forgery_protection.rb', line 216

def storage_strategy(name)
  case name
  when :session
    SessionStore.new
  when :cookie
    CookieStore.new(:csrf_token)
  else
    return name if is_storage_strategy?(name)
    raise ArgumentError, "Invalid CSRF token storage strategy, use :session, :cookie, or a custom CSRF token storage class."
  end
end