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

Brakeman 将能够检测到警卫状态,并且不会再对稍后的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_partialBrakeman 隐藏了任务。

(警告:不一定是“最佳”方式。)

于 2012-06-29T19:27:32.247 回答
0

使用刹车手 4.2.0

我在尝试渲染特定的手动定位和命名模板时遇到了类似的问题。我的应用程序的每个产品都需要特定的命名模板。模板名称来自控制器参数,如params[:a_particular_slug].underscore.

我解决了这样的问题:

  def show
    if @products = Product.where(a_slug: params[:a_particular_slug])
      render template: lookup_context.find(params[:a_particular_slug].underscore, ["featured_products"])
    else
      render_404
    end
  end

在这里,我正在寻找一个模板。如果您需要使用部分,请注意lookup_context.find设置为 true 的第三个参数允许搜索部分。

你可以在这里找到更多lookup_context.find

希望这可以帮助。

于 2018-03-14T13:47:50.423 回答