Предупреждение Rails Brakeman: ложная тревога динамического рендеринга пути?
Я только начинаю с Rails, поэтому я использую Brakeman, чтобы узнать о потенциальных уязвимостях в моем коде новичка. Он выдает высоконадежное предупреждение "Dynamic Render Path" о следующем коде в моем show.js.erb
файл:
$('#media-fragment').html('<%= escape_javascript(render(params[:partial])) %>');
Я действительно ожидал, что это была проблема, так что нет ничего удивительного. Поэтому я изменил это на следующее:
# controller:
def show
if legal_partial?
@allowed_partial = params[:partial]
else
raise StandardError, "unexpected partial request: #{params[:partial]}"
end
end
private
def legal_partial?
%w(screenshots video updates).include? params[:partial]
end
# ...
# show.js.erb
$('#media-fragment').html('<%= escape_javascript(render(@allowed_partial)) %>');
Хотя я считаю, что код теперь безопасен, Борман по-прежнему недоволен этим. Есть ли более идиоматический способ управления рендерингом партиала на основе пользовательского ввода?
2 ответа
Обновление (5/2/2016):
Это было исправлено начиная с Brakeman 3.0.3.
Если legal_partial?
метод указывается так:
def show
if %w(screenshots video updates).include? params[:partial]
@allowed_partial = params[:partial]
else
raise StandardError, "unexpected partial request: #{params[:partial]}"
end
end
Тормоз сможет определить состояние охраны и больше не будет предупреждать о render
вызов.
Оригинальный ответ:
К сожалению, Тормоз не знает, что if legal_partial?
это правильный охранник. Все это знает, что params[:partial]
назначен на @allowed_partial
и затем передается render
,
Вы можете сказать, что @allowed_partial
всегда будет безопасным значением. На этом этапе вы должны решить, имеет ли смысл добавлять сложность, чтобы инструмент был счастливым.
Просто в качестве примера, вы можете сделать это:
def show
render_allowed_partial params[:partial]
end
def render_allowed_partial name
if %w(screenshots video updates).include? name
@allowed_partial = name
else
raise StandardError, "unexpected partial request: #{params[:partial]}"
end
end
Это в основном то же самое, за исключением того, что теперь вы скрываете назначение @allowed_partial
от тормоза.
(Предупреждение: не обязательно "лучший" способ сделать это.)
Использование тормоза 4.2.0
У меня была похожая проблема при попытке отрисовать конкретный шаблон с указанием местоположения и именами. Для каждого продукта моего приложения требовался конкретный названный шаблон. Имя шаблона пришло из параметров контроллера как params[:a_particular_slug].underscore
,
Я решил что-то вроде этого:
def show
if @products = Product.where(a_slug: params[:a_particular_slug])
render template: lookup_context.find(params[:a_particular_slug].underscore, ["featured_products"])
else
render_404
end
end
Здесь я ищу шаблон. Если вам нужно использовать частичное, помните, что lookup_context.find
третий параметр, установленный в true, позволяет искать частичные.
Вы можете найти больше о lookup_context.find
Вот
Надеюсь это поможет.