Rails Brakeman警告:动态渲染路径误报?
我刚刚开始使用Rails,所以我正在使用Brakeman来了解我的新手代码中的潜在漏洞。 它在我的show.js.erb
文件中抛出了一个关于以下代码的高可信度“动态渲染路径”警告:
$('#media-fragment').html('');
我实际上预计这是一个问题,所以毫不奇怪。 所以我把它改成了以下内容:
# 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('');
虽然我相信代码现在是安全的,但Brakeman仍对此不满意。 是否有更惯用的方法来控制基于用户输入的部分渲染?
更新(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?
不知道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
赋值。
(警告:不一定是“最佳”的方式。)
使用制动器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
在这里,我正在寻找一个模板。 如果你需要使用partial,请注意lookup_context.find
第三个params设置为true允许搜索partials。
您可以在此处找到有关lookup_context.find
更多信息
希望这可以帮助。