字符串插入redirect_to通知消息是否存在安全风险



我最近在我的应用程序中运行了brake 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

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

该警告不是关于flash消息的。我不确定您正在查看的是哪种报告格式,但在默认文本输出中,您将看到用+突出显示的危险值,如下所示:

 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

相关内容

  • 没有找到相关文章

最新更新