Как исправить проблему перенаправления Brakeman с несколькими конечными точками отдыха - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время я работаю над решением для выполнения переадресации в RoR, потому что в отчете тормозного оператора я получил ошибку, в которой говорилось, что мне нужно исправить переадресацию надлежащим образом. Я понимаю, о чем говорится в сообщении, и как решить эту проблему в рамках одного действия контроллера. Но теперь я получил следующее. Во время создания экземпляра нового метода я установил заголовок HTTP_REFERER, который можно использовать в действии create.

Это дает мне предупреждение Тормоза, которое можно найти по следующей ссылке

Предположим, у меня есть следующий контроллер с несколькими конечными точками:

 def new
      @my_model_set = MyModel.new
      @referer = request.env['HTTP_REFERER'] # We want to redirect to this referer after a create
 end
def create
  ...
  if @my_model_set.save
     flash_message :success, t('notification.item_created', type: @my_model_set.model_name.human)
     if params[:referer].present?
          redirect_to params[:referer]
     else
          redirect_to admin_my_model_set_path
     end
  else
  ...
  end
end

Я уже пытался исправить это, используя метод redirect_back из RoR, но с использованием ссылки referer файла create метод, который я не хочу использовать.

if @my_model_set.save
    flash_message :success, t('notification.item_created', type: @my_model_set.model_name.human)
    redirect_back(fallback_location: admin_my_model_set_path)
else
 ...
end

1 Ответ

2 голосов
/ 26 мая 2020

Основная проблема в вашем коде заключается в том, что params[:referer] может быть установлено вашим пользователем (или злоумышленником, подделывающим ссылку для вашего пользователя) на произвольное значение, добавив ?referer=https://malicious.site к URL-адресу. Затем вы будете перенаправлены на это, что является уязвимостью открытого перенаправления.

Вы также можете утверждать, что заголовок referer технически вводится пользователем, и вы будете перенаправлять на него, но я бы сказал, что в большинстве случаев и современные браузеры, что, вероятно, было бы приемлемым риском, потому что у злоумышленника на самом деле нет способа использовать его (но это может зависеть от конкретных обстоятельств).

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

Я думаю, вам следует проверить домен перед перенаправлением на него. Если есть общий шаблон (например, если все они являются поддоменами yourdomain.com), проверьте это. Или вы можете попросить своих пользователей сначала зарегистрировать свои домены, прежде чем вы перенаправляете на него (например, посмотрите, как работает OAuth2, вы должны сначала зарегистрировать свой домен приложения, прежде чем пользователь сможет перенаправиться туда с помощью токена).

Если ваш пользователь может просто прийти откуда угодно на #new, и вы хотите отправить его обратно, откуда бы он ни пришел - это, на мой взгляд, не очень хорошее требование, вам, вероятно, не следует этого делать, или вам следует тщательно оценить риск и сознательно принять его если хотите по какой-то причине. В большинстве случаев есть более безопасное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...