【问题标题】:How to execute a string fetched from a YAML file in Ruby如何在 Ruby 中执行从 YAML 文件中获取的字符串
【发布时间】:2013-11-30 17:18:56
【问题描述】:

我的 RailsApplication 中有以下设置:

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。我需要的是执行该行;把它当作一个字符串是没有用的。

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby yaml


    【解决方案1】:

    为了更安全,您可以只将方法名存储在 yaml 文件中

    :MyName:
      :option1: 'new.run!'
      :option2: 'new.new_method'
    

    并使用方法send

    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}
    

    【讨论】:

      【解决方案2】:

      要在字符串中执行代码,可以使用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 文件的人,所以我想这样做是可以的。什么是替代解决方案?
      • 我认为在这种情况下没有其他选择,但如果您是唯一可以访问 YAML 文件的人,那么它相对安全。请注意,切勿将 eval 与您不完全信任的用户提交的代码一起使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2012-02-04
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2016-09-12
      • 2016-03-10
      相关资源
      最近更新 更多