Ответ 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