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