我刚刚开始使用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仍然对此不满意。是否有更惯用的方法来控制基于用户输入的部分渲染?
更新 (2/5/2016):
此问题已在 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
这基本上是一回事,只是现在你向 Brakeman 隐藏了@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
在这里,我正在寻找一个模板。如果需要使用分部,请注意,设置为 true 的第三个参数lookup_context.find
允许搜索分部。
您可以在此处找到有关lookup_context.find
的更多信息
希望这有帮助。