9

当使用ruby​​/rails 时,我正试图解决远程代码执行漏洞contantize

我知道能够为服务器提供任何类名可能有潜在的危险,但我想知道这本身是否很危险。

例如,如果 rails 控制器代码看起来像这样(即在实例化对象上执行硬编码方法):

klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')

这段代码易受攻击吗?还是仅结合能够指定要在类上调用的方法?

4

1 回答 1

8

将字符串转换为常量本身并不危险,但如何使用该常量却有潜在的危险(即随后调用的方法)。

如果你真的需要这样做,那么最好提供一个允许的类列表。例如

klass = params[:class].classify
if %w(Class1 Class2 Class3).include? klass
  klass.constantize.do_something_with_id(params[:id])
else
  raise 'Forbidden'
end

不管怎样,它可以帮助你在晚上睡觉,知道输入是相当有限的。

更新

控制创建的另一种更明确但也更冗长的方法是使用 case 语句:

def create_klass(option)
  case option
  when "option1"
    Class1
  when "option2"
    Class2
  when "option3"
    Class3
  else
    raise "Unknown option"
  end
end

这样,您无需将系统的内部结构暴露给客户端。如果有很多选项,那么您可以使用带有选项映射到类的哈希。

于 2013-08-27T12:56:04.763 回答