2012-06-29 1 views
8

Я только начинаю с Rails, поэтому я использую Brakeman, чтобы узнать о потенциальных уязвимостях в моем коде для новичков. Он бросает высокого доверия «Dynamic Рендер Path» предупреждение о следующем коде в моем show.js.erb файле:Rails Предупреждение Brakeman: Динамический Render Path ложный сигнал?

$('#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)) %>'); 

Хотя я считаю, что код теперь безопасен, кондуктор еще недоволен этим. Есть ли более идиоматический способ управления рендерингом частичного на основе пользовательского ввода?

ответ

7

Обновление (2/5/2016):

Это было исправлено в кондуктор 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 от кондуктора.

(Предупреждение. Не обязательно «лучший» способ сделать это)

+0

Я не могу показаться, чтобы получить состояние охраны для работы модели атрибутов. У меня есть метод на моей модели: 'def sanitized_partial_path; если ["foo", "bar"]. include? (атрибут); "Путь/к/# {атрибут}"; end; 'и он все же дает ложное положительное значение. – Nick

+0

@Nick Brakeman не собирается смотреть содержимое 'sanitized_partial_path' (хотя в будущем Brakeman Pro будет). Пример моего ответа работает из-за назначения переменной экземпляра в действии контроллера, которое используется позже в представлении. – Justin