Межсайтовая защита от подделки (также известная как защита 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, если ваши контроллеры не пропустят проверки маркеров подлинности. В то же время остальная часть вашего набора тестов будет работать без защиты от подделки, которая может быть или не быть желаемым результатом — но это соответствует существующему поведению.
Свежие комментарии