Выполнение предоставленного пользователями кода Ruby на веб-сервере

Я хотел бы позволить своим пользователям создать сценарии Ruby, которые делают вычисление на некоторых данных, находящихся на веб-сервере и затем выходных результатах. Сценарии выполняются на сервере. Там какой-либо путь состоит в том, чтобы сделать это надежно?

Строго говоря, я хотел бы:

  • ограничьте ресурсы, которые сценарий может использовать (память и CPU), и ограничить свое время выполнения
  • ограничьте, какие базовые классы сценарий может использовать (например, Строка, Fixnum, Плавание, Математика и т.д.)
  • позвольте доступу сценария и данным возврата
  • произведите любые ошибки пользователю

Есть ли какие-либо библиотеки или проекты, которые делают то, что я прошу? Если не в Ruby, возможно, некоторый другой язык?

16
задан nolk 11 January 2010 в 22:10
поделиться

1 ответ

-

Вы можете использовать «пустой шифер» в качестве чистой комнаты и песочницу, в которой для установки Безопасный уровень до 4.

Slate Объект, который вы разделили все методы от:

class BlankSlate

  instance_methods.each do |name|
    class_eval do
      unless name =~ /^__|^instance_eval$|^binding$|^object_id$/
        undef_method name
      end
    end
  end

end

Чистая комната - это объект, в котором контекст, в котором вы оцениваете другой код:

  clean_room = BlankSlate.new

прочитайте команду из ненадежного источника, затем неотложной. Если не открытый, Ruby откажется от оценки строки в песочнице.

  command = gets
  command.untaint

Теперь выполните строку в песочнице, прокажу на безопасный уровень, так как он будет идти. Уровень безопасного $ вернется к нормальному времени, когда заканчивается proc. Мы выполняем команду в контексте привязки чистой комнаты, чтобы он мог видеть только методы и переменные, которые можно увидеть только в чистой комнате (помните, что, хотя, как любой объект, чистая комната может видеть что-либо в глобальном Scape).

  result = proc do
    $SAFE = 4
    clean_room.instance_eval do
      binding
    end.eval(command)
  end.call

Распечатайте результат:

  p result
17
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: