В ruby ​​убедитесь, что доступны только определенные методы - PullRequest
4 голосов
/ 16 апреля 2019

Я читал статью о том, как создать простой DSL и анализировать файл, но он (и это справедливо) указывает на то, насколько это опасно, поскольку вы не можете действительно доверять тому, что получает eval ' ред.

Так это заставило меня задуматься, возможно ли сделать это безопасным?

С этой целью, возможно ли гарантировать, что в контексте выполнения доступны только методы DSL (и что конкретно было разрешено), и что вызовы других вещей просто ничего не сделают или не приведут к ошибке?

Код, используемый в примере:

class OrdersDsl
  def initialize
    @orders = { to_perform: [], to_schedule: [] }.freeze
  end

  def parse(order_filename)
    instance_eval File.read(order_filename)
  end

  private

  def order_now(order_name, *order_options)
    @orders[:to_perform] << serialize_order(order_name, *order_options)
  end

  def schedule(order_name, *order_options)
    @orders[:to_schedule] << serialize_order(order_name, *order_options)
  end

  def serialize_order(name, *options)
    [name, *options]
  end

  def OrdersDsl.run(order_filename = 'Orders')
    OrdersDsl.new.parse(order_filename)
  end
end
...