当我使用contantize
时,我正试图解决ruby / rails中的远程代码执行漏洞。
我知道能够向服务器提供任何类名称可能会有潜在危险,但我想知道这个本身是否危险。
例如,如果rails控制器代码看起来像这样(即在实例化对象上执行硬编码方法):
klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')
这段代码容易受到攻击吗?或者只是结合能够指定要在类上调用的方法?
答案 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
这样,您无需将系统内部暴露给客户端。如果有很多选项,那么您可以使用带有选项映射到类的哈希。