Подтвердить что ты не робот

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

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

В частности, я хотел бы:

  • ограничить ресурсы, которые может использовать script (память и процессор), и ограничить время его работы
  • ограничить, какие классы ядра могут использовать script (например, String, Fixnum, Float, Math и т.д.)
  • предоставить script данные о доступе и возврате
  • выводить любые ошибки пользователю

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

4b9b3361

Ответ 1

Вы можете использовать "чистый сланец" как чистую комнату, а также песочницу, в которой можно установить безопасный уровень до 4.

Чистый сланец объекта, который вы лишили всех методов:

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

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

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

напечатать результат:

  p result