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?
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
@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