модуль ActionController::RequestForgeryProtection::ClassMethods
Открытые методы экземпляра
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 206
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 Включает защиту от подделки запросов. Обратите внимание, что запросы GET и HEAD не проверяются.
class ApplicationController < ActionController::Base protect_from_forgery end class FooController < ApplicationController protect_from_forgery except: :index end
Защиту от подделки запросов для контроллера можно отключить с помощью skip_forgery_protection:
class BarController < ApplicationController skip_forgery_protection end
Допустимые параметры:
-
:only/:except— применять защиту от подделки запросов только к некоторым действиям. Например,only: [ :create, :create_all ]. -
:if/:unless— полностью отключить защиту от подделки запросов в зависимости от переданного Proc или ссылки на метод. -
:prepend— по умолчанию проверка токена аутентичности добавляется в позицию вызоваprotect_from_forgeryв вашем приложении. Это означает, что все обратные вызовы, добавленные ранее, выполняются первыми. Это полезно, если вы хотите, чтобы защита от подделки запросов зависела от других обратных вызовов, например методов аутентификации (OAuth или аутентификация с помощью cookie).Чтобы добавить проверку в начало цепочки обратных вызовов, используйте
prepend: true. -
:with— задаёт метод обработки непроверенного запроса. Обратите внимание: еслиdefault_protect_from_forgeryимеет значение true,Railsвызываетprotect_from_forgeryс параметромwith :exception.
Встроенные методы обработки непроверенных запросов:
-
:exception— вызывает исключение ActionController::InvalidAuthenticityToken. -
:reset_session— сбрасывает сессию. -
:null_session— предоставляет пустую сессию на время запроса, но не сбрасывает её полностью. Используется по умолчанию, если параметр:withне задан.
Вы также можете реализовать собственные классы стратегий для обработки непроверенных запросов:
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— задаёт стратегию хранения и извлечения токенов CSRF.
Встроенные стратегии хранения токенов в сессии:
-
:session— сохраняет токен CSRF в сессии. Используется по умолчанию, если параметр:storeне задан. -
:cookie— сохраняет токен CSRF в зашифрованной cookie.
Вы также можете реализовать собственные классы стратегий для хранения токенов CSRF:
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
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 223
def skip_forgery_protection(options = {})
skip_before_action :verify_authenticity_token, options.reverse_merge(raise: false)
end Отключает защиту от подделки запросов. Это обёртка для:
skip_before_action :verify_authenticity_token
Допустимые параметры см. в skip_before_action.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.