9

私は Rails を使い始めたばかりなので、Brakemanを使用して初心者向けコードの潜在的な脆弱性について学習しています。show.js.erbファイル内の次のコードについて、信頼性の高い「動的レンダリング パス」警告が表示されます。

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

私はコードが安全になったと信じていますが、Brakeman はまだこれに不満を持っています. ユーザー入力に基づいてパーシャルのレンダリングを制御するより慣用的な方法はありますか?

4

2 に答える 2

7

更新 (2016 年 2 月 5 日):

これは Brakeman 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

renderBrakeman はガード状態を検出できるようになり、後の呼び出しについて警告しなくなります。


元の答え:

if legal_partial?残念ながら、Brakeman はそれが適切なガードであることを知りません。それが知っているのは、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、Brakeman からの割り当てを隠している点が異なります。

(警告: これを行うのが必ずしも「最善」の方法であるとは限りません。)

于 2012-06-29T19:27:32.247 に答える