Ruby on rails 如何在Ruby中执行从YAML文件获取的字符串
我的Rails应用程序中有以下设置:Ruby on rails 如何在Ruby中执行从YAML文件获取的字符串,ruby-on-rails,ruby,yaml,Ruby On Rails,Ruby,Yaml,我的Rails应用程序中有以下设置: class MyClass def self.perform_action! specific_name init = YAML.load_file('path/to/file.yml')[specific_name] input = init[:option1] 以下是加载的YAML文件: :MyName: :option1: 'Data::Executables::SpecificFunction.new.run!'
class MyClass
def self.perform_action! specific_name
init = YAML.load_file('path/to/file.yml')[specific_name]
input = init[:option1]
以下是加载的YAML文件:
:MyName:
:option1: 'Data::Executables::SpecificFunction.new.run!'
:option2: 'Data::Executables::SpecificFunction.new.new_method'
现在,当我调用MyClass.perform_action时!(:MyName)它确实获取了:option1
的值,并将其设置为等于input
。我需要的是执行这一行;把它当作字符串是没有用的
如何执行?要执行字符串中的代码,可以使用
eval
:
class MyClass
def self.perform_action! specific_name
init = YAML.load_file('path/to/file.yml')[specific_name]
input = init[:option1]
result = eval(input)
如果您完全信任YAML文件,我建议您这样做,否则外部人员可以完全访问您的系统,因为
eval
运行传递给它的任何代码,无论是否恶意。要以字符串形式执行代码,您可以使用eval
:
class MyClass
def self.perform_action! specific_name
init = YAML.load_file('path/to/file.yml')[specific_name]
input = init[:option1]
result = eval(input)
如果您完全信任YAML文件,我建议您这样做,否则外部人员可以完全访问您的系统,因为
eval
运行传递给它的任何代码,无论是否恶意。为了更安全,您只能以YAML文件方法的名称存储
:MyName:
:option1: 'new.run!'
:option2: 'new.new_method'
并使用方法发送
class MyClass
def self.perform_action! specific_name
init = YAML.load_file('path/to/file.yml')[specific_name]
chain = init[:option1].split('.')
allowable_methods = Data::Executables::SpecificFunction
result = chain.reduce(allowable_methods){|target, method| target.send method}
为了更安全,您只能以yaml文件方法的名称存储
:MyName:
:option1: 'new.run!'
:option2: 'new.new_method'
并使用方法发送
class MyClass
def self.perform_action! specific_name
init = YAML.load_file('path/to/file.yml')[specific_name]
chain = init[:option1].split('.')
allowable_methods = Data::Executables::SpecificFunction
result = chain.reduce(allowable_methods){|target, method| target.send method}
谢谢你提供的信息。我是唯一一个可以访问YAML文件的人,所以我想这样做是可以的。什么是替代方案?我认为在这种情况下没有替代方案,但如果您是唯一能够访问YAML文件的人,那么它相对安全。请注意,切勿将
eval
用于您不完全信任的用户提交的代码。谢谢您提供的信息。我是唯一一个可以访问YAML文件的人,所以我想这样做是可以的。什么是替代方案?我认为在这种情况下没有替代方案,但如果您是唯一能够访问YAML文件的人,那么它相对安全。请注意,切勿将eval
用于您不完全信任的用户提交的代码。