Вы можете использовать «чистый лист» в качестве чистой комнаты и песочницу, в которой можно установить безопасный уровень на 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