Ruby on rails 如何在Ruby中执行从YAML文件获取的字符串

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!'

我的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!'
  :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
用于您不完全信任的用户提交的代码。