Песочница JSR-223
Я пытаюсь использовать песочницу JSR-223. В частности, я не хочу, чтобы script имел доступ к любому из моих классов. (Я слышал, что Rhino может сделать это с помощью ClassShutter, но я хочу сделать это вообще, т.е. Для всех script двигателей JSR-223).
Сначала я попытался использовать решение AccessController.doPrivileged
, не передав никаких разрешений вообще. Он работает для большинства разрешений, но скрипты могут получить доступ ко всем моим общедоступным классам (он, кажется, игнорирует разрешение доступа к пакету...?).
I нашел это. Мой вопрос: как установить пользовательский ClassLoader в движок script? (Или Как заменить ClassLoader глобально, если мне нужно?)
Ответы
Ответ 1
Существует конструктор для ScriptEngineManager, который принимает загрузчик классов. Погрузчик классов используется для загрузки реализации механизма сценариев. Поскольку классы наследуют их загрузчики классов, механизм сценариев и любые созданные им объекты также должны использовать этот загрузчик классов.
Этот загрузчик классов должен отрицать существование любых классов, которые не имеют белого цвета.
Скомпонуйте его с помощью специального SecurityManager, чтобы вы могли использовать проверки доступа к используемому загрузчику классов.
Изменить: Здесь статья, которую я нашел в Песочница Rhino в Java. Большая часть из них должна также применяться к JSR-223. Реализация Sun - это Rhino с изменениями, поэтому могут быть некоторые различия.
Ответ 2
Возможно ли запустить часть вашего приложения, для которой требуется механизм сценариев в отдельной JVM? Вы можете запустить JVM сценариев с другим классом классов (и менеджером безопасности), а затем использовать некоторую форму легкого сообщения, проходящего между двумя JVM.
Ответ 3
Смотрите http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java и связанные классы в том же пакете, особенно там SANDBOXING_FACTORY.
Этот код, который изолирует интерпретатор носорога, позволяет ему получить доступ к файловой системе, опосредованной загрузчиком.