Является ли строка интерполяцией сообщения-уведомления 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
с символами или строками.