0

我最近对我的应用程序运行了Brakeman gem,其中一个警告是关于我的控制器中的重定向行:

Confidence:  High
Warning type:  Redirect
Message:  Possible unprotected redirect near line xx

在我的控制器的那一行中,我的重定向通知消息包括用户上传的对象的名称:

def update
  parent_klass = params[:parent_type].constantize
  @entity = parent_klass.find params[:parent_id]

  authorize! :update, @entity

  entity_param_key = params[:parent_type].downcase.to_sym
  @entity.update_attributes params[entity_param_key]

  cache_path = begin
    if parent_klass == Clinic
      clinic_path(@entity)
    else
      specialist_path(@entity)
    end
  end
  expire_fragment cache_path

  redirect_to @entity, :notice  => "Successfully updated #{@entity.name}."
end

在这个控制器中,@entity.name是一个由用户定义的表单值,这意味着理论上有人可以尝试将恶意代码放入该字段。但是我不确定使用该参数生成通知是否存在安全风险。

Flash 通知消息在视图中显示如下(在 HAML 中):

#body.container
  .row
    #content.span12
      #container
        - flash.each do |type, msg|
          .alert.alert-success= msg

        = yield

此控制器模式是否存在安全风险,如果是,我如何在保持自定义通知消息的同时防止它成为安全风险?

4

1 回答 1

2

警告与闪存消息无关。我不确定您正在查看哪种报告格式,但在默认文本输出中,您会看到危险值突出显示,+如下所示:

 redirect_to(+params[:parent_type].constantize.find(params[:parent_id])+ ...

在 JSON 报告中它说

 "user_input": "params[:parent_type].constantize.find(params[:parent_id])",

重定向的安全性取决于该authorize!方法在有效模型中验证params[:parent_type].constantize结果的能力以及(我假设)当前用户是否可以修改它。如果它真的产生一个模型,那么重定向是安全的。

但是,在这种方法中,可能的开放重定向是您最不担心的问题。

这些行允许攻击者find使用任意参数调用任意类:

parent_klass = params[:parent_type].constantize
@entity = parent_klass.find params[:parent_id]

虽然find方法不太可能有那么危险,但请考虑应用程序中可能包含的大量代码,以及某处是否可能有某个类带有find您真的不希望攻击者调用的方法。

下一点看起来像潜在的质量分配:

entity_param_key = params[:parent_type].downcase.to_sym
@entity.update_attributes params[entity_param_key]

鉴于permit这里没有调用,我可以假设这个应用程序没有使用强参数。希望它将可用于批量分配的键列入白名单,使用attr_accessible.

同样params[:parent_type].downcase.to_sym是符号创建的潜在内存泄漏。通常这在现代应用程序中并不是什么大问题,但在这种情况下,转换是不必要的,因为您可以params使用符号或字符串进行访问。

于 2015-09-16T08:31:45.287 回答