2012-06-29 10 views
8

Po prostu zaczynam od Railsów, więc używam Brakeman, aby poznać potencjalne luki w moim kodzie dla początkujących. To rzucanie wysokiego zaufania „Dynamic Render Path” ostrzeżenie o następujący kod w moim pliku show.js.erb:Ostrzeżenie przed brakiem szyny: Dynamic Render Path false alarm?

$('#media-fragment').html('<%= escape_javascript(render(params[:partial])) %>'); 

I rzeczywiście oczekiwać tego był problem, więc nic dziwnego tam. Więc zmieniłem je na następujące kwestie:

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

Chociaż wierzę, że kod jest teraz bezpieczne, hamulcowego jest nadal niezadowolony z tego. Czy istnieje bardziej idiomatyczny sposób kontrolowania renderowania częściowego na podstawie danych wprowadzanych przez użytkownika?

Odpowiedz

7

Aktualizacja (05.02.2016):

ten został ustalony na dzień hamulcowego 3.0.3.

Jeśli metoda legal_partial? jest inlined tak:

def show 
    if %w(screenshots video updates).include? params[:partial] 
    @allowed_partial = params[:partial] 
    else 
    raise StandardError, "unexpected partial request: #{params[:partial]}" 
    end 
end 

hamulcowego będzie w stanie wykryć stan osłony i nie będzie ostrzegać o późniejszym render rozmowy.


Oryginalny odpowiedź:

Niestety hamulcowego nie wie, że jest to właściwa if legal_partial? strażnik. Wiadomo jedynie, że params[:partial] jest przypisane do @allowed_partial, a następnie jest przekazywane do render.

Możesz być w stanie powiedzieć, że @allowed_partial zawsze będzie bezpieczną wartością. W tym momencie należy zastanowić się, czy nie ma sensu dodawać złożoności, aby narzędzie było szczęśliwe.

Tylko jako przykład, można to zrobić:

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 

Jest to w zasadzie to samo, z wyjątkiem teraz ukrywają przypisanie @allowed_partial od hamulcowego.

(Ostrzeżenie:. Niekoniecznie „najlepszy” sposób to zrobić)

+0

I nie wydają się uzyskać stan osłony pracować dla atrybutów modelu. Mam metodę na moim modelu: 'def sanitized_partial_path; jeśli ["foo", "bar"]. include? (atrybut); "ścieżka/do/# {atrybut}"; end; 'i nadal daje fałszywy alarm. – Nick

+0

@Nick Brakeman nie przyjrzy się zawartości 'sanitized_partial_path' (choć w przyszłości Brakeman Pro będzie). Przykład w mojej odpowiedzi działa z powodu przypisania do zmiennej instancji w akcji kontrolera, która jest używana później w widoku. – Justin

Powiązane problemy