2012-06-29 3 views
8

私はちょうど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はまだこれに不満です。ユーザーの入力に基づいて部分のレンダリングを制御するもっと慣れた方法はありますか?

答えて

7

更新(2016年2月5日):

これは、制動手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_pa​​rtial_path; if ["foo"、 "bar"]。?(属性)を含む。 "パス/ to /#{属性}";そしてそれは依然として偽陽性を与える。 – Nick

+0

@Nick Brakemanは、 'sanitized_pa​​rtial_path'の内容を見ていません(将来Brakeman Proはそうですが)。私の答えの例は、後でビューで使用されるコントローラアクションのインスタンス変数への代入のために機能します。 – Justin

関連する問題