gpt4 book ai didi

ruby-on-rails - 使用 constantize 在 ruby​​ 中远程执行代码

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:09 29 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

这样,您就不需要向客户端公开系统的内部结构。如果有很多选项,那么您可以使用带有选项映射到类的散列。

关于ruby-on-rails - 使用 constantize 在 ruby​​ 中远程执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465564/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com