Является ли строка интерполяцией сообщения-уведомления redirect_to угрозой безопасности?

Я недавно запустил драгоценный камень Brakeman против моего приложения, и одно из его предупреждений касалось линии перенаправления в моем контроллере:

Confidence:  High
Warning type:  Redirect
Message:  Possible unprotected redirect near line xx

В этой строке в моем контроллере мое уведомление о перенаправлении содержит имя объекта, загруженного пользователем:

def update
  parent_klass = params[:parent_type].constantize
  @entity = parent_klass.find params[:parent_id]

  authorize! :update, @entity

  entity_param_key = params[:parent_type].downcase.to_sym
  @entity.update_attributes params[entity_param_key]

  cache_path = begin
    if parent_klass == Clinic
      clinic_path(@entity)
    else
      specialist_path(@entity)
    end
  end
  expire_fragment cache_path

  redirect_to @entity, :notice  => "Successfully updated #{@entity.name}."
end

В этом контроллере @entity.name это значение формы, определяемое пользователем, означающее, что кто-то в теории может попытаться поместить вредоносный код в это поле. Однако я не уверен, что использование этого параметра для создания уведомления представляет угрозу безопасности.

Вспышка уведомлений представляется в виде как таковой (в HAML):

#body.container
  .row
    #content.span12
      #container
        - flash.each do |type, msg|
          .alert.alert-success= msg

        = yield

Является ли этот шаблон контроллера угрозой безопасности, и если да, как я могу предотвратить его как угрозу безопасности при сохранении настроенного уведомления?

1 ответ

Предупреждение не о флеш-сообщении. Я не уверен, какой формат отчета вы просматриваете, но при выводе текста по умолчанию вы увидите опасное значение, выделенное + как это:

 redirect_to(+params[:parent_type].constantize.find(params[:parent_id])+ ...

в отчете JSON говорится

 "user_input": "params[:parent_type].constantize.find(params[:parent_id])",

Безопасность перенаправления зависит от того, насколько хорошо authorize! метод проверяет params[:parent_type].constantize приводит к действительной модели и (я предполагаю), текущий пользователь может изменить ее. Если это действительно приводит к модели, перенаправление безопасно.

Тем не менее, возможный открытый редирект - это наименьшее беспокойство в этом методе.

Эти строки позволяют злоумышленнику позвонить find на произвольном классе с произвольным аргументом:

parent_klass = params[:parent_type].constantize
@entity = parent_klass.find params[:parent_id]

Хотя это вряд ли find Метод будет настолько опасным, рассмотрите множество кода, вероятно, включенного в приложение, и есть ли где-нибудь класс с find метод, который вы действительно не хотите, чтобы злоумышленник вызывал.

Следующий бит выглядит как потенциальное массовое назначение:

entity_param_key = params[:parent_type].downcase.to_sym
@entity.update_attributes params[entity_param_key]

Учитывая отсутствие permit позвоните сюда, я могу предположить, что это приложение не использует сильные параметры. Надеемся, что это белый список ключей, доступных для массового назначения с помощью attr_accessible,

Также params[:parent_type].downcase.to_sym это потенциальная утечка памяти при создании символа. Обычно это не так уж важно в современных приложениях, но в этом случае преобразование не требуется, так как вы можете получить доступ params с символами или строками.

Другие вопросы по тегам