用constantize在ruby中远程执行代码

时间:2013-08-27 12:33:26

标签: ruby-on-rails ruby security

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

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

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

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

这段代码容易受到攻击吗?或者只是结合能够指定要在类上调用的方法?

1 个答案:

答案 0 :(得分:7)

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

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

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

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