Rails Brakeman警告:动态渲染路径误报?

Geo*_*old 9 ruby ruby-on-rails ruby-on-rails-3 brakeman

我刚开始使用Rails,所以我正在使用Brakeman来了解我的新手代码中的潜在漏洞.它在我的show.js.erb文件中抛出了一个高可信度的"动态渲染路径"警告:

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

我实际上预计这是一个问题,所以毫不奇怪.所以我把它改成了以下内容:

  # 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)) %>');
Run Code Online (Sandbox Code Playgroud)

虽然我相信代码现在是安全的,但Brakeman仍对此不满意.是否有更惯用的方法来控制基于用户输入的部分渲染?

Jus*_*tin 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
Run Code Online (Sandbox Code Playgroud)

Brakeman将能够检测到防守状态,并且不再警告后来的render呼叫.


原始答案:

不幸的是,Brakeman并不知道这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
Run Code Online (Sandbox Code Playgroud)

这基本上是一回事,除非你现在隐藏了@allowed_partialBrakeman 的任务.

(警告:不一定是"最佳"的方式.)