Я хотел бы позволить своим пользователям создать сценарии Ruby, которые делают вычисление на некоторых данных, находящихся на веб-сервере и затем выходных результатах. Сценарии выполняются на сервере. Там какой-либо путь состоит в том, чтобы сделать это надежно?
Строго говоря, я хотел бы:
Есть ли какие-либо библиотеки или проекты, которые делают то, что я прошу? Если не в Ruby, возможно, некоторый другой язык?
Вы можете использовать «пустой шифер» в качестве чистой комнаты и песочницу, в которой для установки Безопасный уровень до 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