модуль ActionController::RequestForgeryProtection
Действия контроллера защищены от атак межсайтовой подделки запросов (CSRF) путем включения маркера в рендеренном HTML для вашего приложения. Этот маркер хранится как случайная строка в сессии, к которой злоумышленник не имеет доступа. Когда запрос достигает вашего приложения, Rails проверяет полученный маркер с маркером в сессии. Все запросы проверяются, за исключением запросов GET, поскольку они должны быть идемпотентными. Имейте в виду, что все запросы, ориентированные на сессию, должны быть защищены от CSRF, включая запросы JavaScript и HTML.
Поскольку запросы HTML и JavaScript обычно выполняются из браузера, нам необходимо гарантировать проверку подлинности запроса для веб-браузера. Мы можем использовать аутентификацию, ориентированную на сессию, для этих типов запросов, используя метод `protect_from_forgery` в наших контроллерах.
Запросы GET не защищены, поскольку они не имеют побочных эффектов, таких как запись в базу данных, и не раскрывают конфиденциальную информацию. Запросы JavaScript являются исключением: сторонний сайт может использовать тег <script> для ссылки на URL JavaScript на вашем сайте. Когда ваш ответ JavaScript загружается на их сайте, он выполняется. С тщательно продуманным JavaScript с их стороны, конфиденциальные данные в вашем ответе JavaScript могут быть извлечены. Чтобы предотвратить это, только запросы XmlHttpRequest (известные как XHR или Ajax) разрешены для выполнения запросов GET для ответов JavaScript.
Важно помнить, что запросы XML или JSON также затронуты, и если вы создаёте API, вы должны изменить метод защиты от подделки в ApplicationController (по умолчанию: :exception):
class ApplicationController < ActionController::Base
protect_from_forgery unless: -> { request.format.json? }
end
Защита от CSRF включается методом protect_from_forgery. По умолчанию protect_from_forgery защищает вашу сессию с помощью метода :null_session, который предоставляет пустую сессию во время запроса.
Мы можем захотеть отключить защиту от CSRF для API, поскольку они обычно разработаны для работы без состояния. То есть клиент API будет обрабатывать сессию за вас, а не Rails.
Параметр маркера по умолчанию называется authenticity_token. Имя и значение этого маркера должны быть добавлены в каждый макет, который рендерит формы, включив csrf_meta_tags в HTML head.
Узнайте больше об атаках CSRF и защите вашего приложения в руководстве по безопасности Ruby on Rails Ruby on Rails Security Guide.
Защищённые методы экземпляра
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 222 def handle_unverified_request forgery_protection_strategy.new(self).handle_unverified_request end
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 211
def verify_authenticity_token
mark_for_same_origin_verification!
if !verified_request?
if logger && log_warning_on_csrf_failure
logger.warn "Can't verify CSRF token authenticity."
end
handle_unverified_request
end
end Фактический before_action, который используется для проверки маркера CSRF. Не переопределяйте его напрямую. Вместо этого предоставьте свою стратегию защиты от подделки. Если вы переопределите, вы отключите проверку <script> с тем же источником.
Опирайтесь на объявление protect_from_forgery, чтобы указать, какие действия требуют проверки запросов из того же источника. Если protect_from_forgery включен для действия, этот before_action помечает его после_action, чтобы проверить, что ответы JavaScript предназначены для запросов XHR, гарантируя, что они следуют политике безопасности одного источника браузера.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.