私はちょうどRailsを使い始めているので、私はを使って初心者向けコードの潜在的な脆弱性について学んでいます。Rails Brakeman warning:ダイナミックレンダリングパス誤警報?
$('#media-fragment').html('<%= escape_javascript(render(params[:partial])) %>');
私は実際にこれが問題だった期待、そこにとても驚き:高い信頼私のshow.js.erb
ファイルに次のコードを警告「動的パスをレンダリング」投げています。だから私は次のように変更しました:
# 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)) %>');
私はコードが安全であると信じていますが、Brakemanはまだこれに不満です。ユーザーの入力に基づいて部分のレンダリングを制御するもっと慣れた方法はありますか?
モデル属性ではガード条件が機能しないようです。私のモデルにはメソッドがあります: 'def sanitized_partial_path; if ["foo"、 "bar"]。?(属性)を含む。 "パス/ to /#{属性}";そしてそれは依然として偽陽性を与える。 – Nick
@Nick Brakemanは、 'sanitized_partial_path'の内容を見ていません(将来Brakeman Proはそうですが)。私の答えの例は、後でビューで使用されるコントローラアクションのインスタンス変数への代入のために機能します。 – Justin