PUT / POST-запрос дроссельной заслонки Перенаправление атаки в стойку не работает - PullRequest
0 голосов
/ 05 апреля 2020

Итак, у меня есть форма, которая переводит XHR во внешний API для получения токена, а затем отправляет URL-адрес, который вызывает нашу базу данных по адресу "/ update" на нашем бэкэнде. Мы пытаемся ограничить количество запросов, которые человек может сделать с помощью формы с помощью дросселя атаки в стойку. Таким образом, при достижении предела, например, после двух попыток третья должна выдать ошибку 429, а затем перенаправить на нашу страницу /429. У меня есть это до сих пор:

throttle '/update', {
    limit: 2,
    period: 60
  } do |req|
    next nil unless req.path == '/update' && req.put?

    req.ip
  end

Тогда для нашего ответа дросселя мы делаем:

Rack::Attack.throttled_response = lambda do |env|
headers = {
        'Location' => '/429'
      }
      [302, headers]
  end

Код работает и возвращает 429, но перенаправление не происходит, даже если у нас есть Location в заголовках. Также у нас есть конечная точка, где мы делаем GET, и тот же ответ перенаправляет пользователя на /429 успешно.

Так как перенаправить пользователя при выполнении запроса put или post с помощью Rack Атака ruby на библиотеку рельсов? Есть ли другой способ перенаправить пользователя? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 апреля 2020

Проблема с кодом статуса ответа HTTP. Если вы хотите, чтобы браузер перенаправлял вас, вам нужно использовать один из статусов 3XX.

# frozen_string_literal: true

module Rack
  class Attack
    throttle('test', limit: 1, period: 60.seconds) do |req|
      true
    end
  end

  # response
  Rack::Attack.throttled_response = lambda do |env|
    headers = {
        'Location' => '/test_redirect'
    }
    [301, headers, []]
  end
end
...