Межсайтовая защита от подделок в тестах Rails

Межсайтовая защита от подделки (также известная как защита CSRF) является встроенной функцией в Rails.

Действия контроллера защищены от атак подделки межсайтовых запросов (CSRF) путем включения токена в отображаемый HTML-код для вашего приложения. Этот токен хранится в виде случайной строки в сеансе, к которой у злоумышленника нет доступа. Когда запрос достигает вашего приложения, Rails проверяет полученный токен с токеном в сеансе. Все запросы проверяются, кроме запросов GET, поскольку они должны быть идемпотентными. Помните, что все сессионные запросы должны быть защищены CSRF, включая запросы JavaScript и HTML.

Однако по умолчанию эта защита отключена в тестовых средах. Это облегчает тестирование контроллеров без необходимости предоставлять токен CSRF при каждом запросе, но может вызвать проблемы, поскольку наши тесты не полностью отражают реальные запросы.

Это особенно верно для контроллеров API, где сеансы не используются и поэтому токены CSRF не используются. Это означает, что контроллеры API обычно пропускают проверку токена CSRF, выполняя skip_before_action: verify_authenticity_token. Однако, если вы забудете пропустить эту проверку, ваши тесты все равно пройдут, поскольку защита от подделки полностью отключена! Чтобы избежать этой проблемы, я попытался выяснить, можно ли настроить RSpec для включения защиты от подделки для тестов API.

# spec/rails_helper.rb
RSpec.configure do |config|

  config.define_derived_metadata(file_path: Regexp.new('/spec/requests/api/')) do |metadata|
    metadata[:allow_forgery_protection] = true
  end

  config.around(:each, allow_forgery_protection: true) do |example|
    original_forgery_protection = ActionController::Base.allow_forgery_protection
    ActionController::Base.allow_forgery_protection = true
    begin
      example.run
    ensure
      ActionController::Base.allow_forgery_protection = original_forgery_protection
    end
  end

end

Используя эту конфигурацию, ваши тесты будут выполнять обычные проверки CSRF, что означает, что вы получите ответ 422, если ваши контроллеры не пропустят проверки маркеров подлинности. В то же время остальная часть вашего набора тестов будет работать без защиты от подделки, которая может быть или не быть желаемым результатом — но это соответствует существующему поведению.

Author: admin