Ruby позволяет вам установить глобальную переменную $SAFE
, которая будет точно определять, что разрешено делать испорченному коду. Подробнее об этом читайте в Блокировка Ruby в сейфе .
Если перефразировать, вот таблица эффектов $SAFE
:
$ БЕЗОПАСНЫЕ Ограничения
0 Проверка использования предоставленных извне (испорченных) данных не производится. Это режим по умолчанию в Ruby.
> = 1 Ruby запрещает использование испорченных данных в потенциально опасных операциях.
> = 2 Ruby запрещает загрузку программных файлов из глобально доступных для записи мест.
> = 3 Все вновь созданные объекты считаются испорченными.
> = 4 Ruby эффективно разбивает работающую программу на две части. Необработанные объекты не могут быть изменены. Обычно это используется для создания «песочницы»: программа устанавливает среду, используя более низкий уровень $SAFE
, затем сбрасывает $SAFE
до 4, чтобы предотвратить последующие изменения в этой среде.
Это содержимое таблицы в нижней части связанной страницы, которая объясняет, что могут делать испорченные объекты на каждом уровне $SAFE
. Исходя из этого, вы можете легко понять, какие плохие вещи может сделать код Ruby.
Определение безопасных уровней
$ SAFE> = 1
- Переменные среды RUBYLIB и RUBYOPT не обрабатываются, и текущий каталог не добавляется в путь.
- Параметры командной строки -e, -i, -I, -r, -s, -S и -x не допускаются.
- Невозможно запустить процессы из $ PATH, если любой каталог в нем доступен для записи во всем мире.
- Невозможно манипулировать каталогом, имя которого является испорченной строкой, или выполнять поиск в нем.
- Не может связать испорченные строки.
- Не может оценить испорченные строки.
- Невозможно загрузить или запросить файл, имя которого является испорченной строкой.
- Невозможно манипулировать или запрашивать состояние файла или канала, имя которого является испорченной строкой.
- Невозможно выполнить системную команду или выполнить программу из испорченной строки.
- Нельзя передать ловушку испорченной нити.
$ SAFE> = 2
- Невозможно изменить, создать или удалить каталоги или использовать chroot.
- Не удается загрузить файл из общедоступного каталога.
- Невозможно загрузить файл с испорченным именем файла, начинающимся с ~.
- Невозможно использовать File # chmod, File # chown, File # lstat, File.stat, File # truncate, File.umask, File # flock, IO # ioctl, IO # stat, Kernel # fork, Kernel # syscall Ядро # ловушка. Process :: setpgid, Process :: setsid, Process :: setpriority или Process :: egid =.
- Не удается обработать сигналы с использованием ловушки.
$ SAFE> = 3
- Все объекты созданы испорченными.
- Невозможно удалить объекты.
$ SAFE> = 4
- Невозможно изменить необработанный массив, хэш или строку.
- Невозможно изменить глобальную переменную.
- Невозможно получить доступ к переменным экземпляра незапятнанных объектов.
- Невозможно изменить переменную среды.
- Невозможно закрыть или открыть незапрошенные файлы.
- Не может заморозить незапятнанные объекты.
- Невозможно изменить видимость методов (приватных / общедоступных / защищенных).
- Невозможно создать псевдоним в незапятнанном классе или модуле.
- Не удается получить метаинформацию (например, списки методов или переменных).
- Невозможно определить, переопределить, удалить или отменить определение метода в незаполненном классе или модуле.
- Невозможно изменить объект.
- Невозможно удалить переменные или константы экземпляра из необработанных объектов.
- Невозможно манипулировать потоками, завершить поток, отличный от текущего, или установить abort_on_exception.
- Не может быть локальных переменных потока.
- Невозможно вызвать исключение в потоке с более низким значением $ SAFE.
- Невозможно перемещать темы между группами нитей.
- Невозможно вызвать выход, выход !, или прервать.
- Может загружать только обернутые файлы и не может включать модули в классы и модули, не содержащие данных.
- Невозможно преобразовать идентификаторы символов в ссылки на объекты.
- Невозможно записать в файлы или каналы.
- Невозможно использовать автозагрузку.
- Не может испортить объекты.