Spec-Zone.ru › Ruby on Rails 5.1

модуль ActionController::RequestForgeryProtection

Включенные модули:
AbstractController::Helpers, AbstractController::Callbacks

Действия контроллеров защищаются от атак межсайтового подлога (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.

Приватные методы экземпляра

handle_unverified_request() Показать исходный код
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 226
def handle_unverified_request # :doc:
  forgery_protection_strategy.new(self).handle_unverified_request
end
verify_authenticity_token() Показать исходный код
# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 211
def verify_authenticity_token # :doc:
  mark_for_same_origin_verification!

  if !verified_request?
    if logger && log_warning_on_csrf_failure
      if valid_request_origin?
        logger.warn "Can't verify CSRF token authenticity."
      else
        logger.warn "HTTP Origin header (#{request.origin}) didn't match request.base_url (#{request.base_url})"
      end
    end
    handle_unverified_request
  end
end

Фактический метод перед действием, используемый для проверки токена CSRF. Не переопределяйте его напрямую. Вместо этого предоставьте свою собственную стратегию защиты от подлога. Если вы переопределите, вы отключите проверку происхождения `<script>`.

Опирайтесь на объявление `protect_from_forgery` для обозначения действий, которые требуют проверки запросов из одного источника. Если `protect_from_forgery` включен для действия, этот метод перед действием помечает его метод после действия, чтобы проверить, что JavaScript-ответы предназначены для запросов XHR, гарантируя, что они следуют политике одного происхождения браузера.

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API