Предупреждение 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 Вот

Надеюсь это поможет.

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