当使用contantize时,我正试图了解ruby/rails中的远程代码执行漏洞。
我知道能够为服务器提供任何类名可能是潜在的危险,但我想知道这本身是否危险。
例如,如果rails控制器代码如下所示(即对实例化对象执行硬编码方法):
klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')这个代码易受攻击吗?还是只结合能够指定要在类上调用的方法?
发布于 2013-08-27 12:56:04
将字符串转换为常量本身并不危险,但如何使用该常量是潜在的危险(即随后调用的方法)。
如果您确实需要这样做,那么最好提供一个允许的类列表。例如。
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这样,您就不需要向客户端公开系统的内部结构。如果有许多选项,则可以使用带有选项映射到类的散列。
https://stackoverflow.com/questions/18465564
复制相似问题