Как вы можете запустить Javascript, используя Rhino для Java в песочнице? - PullRequest
36 голосов
/ 18 сентября 2008

Часть нашего java-приложения должна запускать javascript, написанный не разработчиками. Эти не разработчики используют JavaScript для форматирования данных. (В основном простая логика и конкатенация строк).

У меня вопрос: как настроить выполнение этих сценариев, чтобы ошибки сценариев не оказывали серьезного негативного влияния на остальную часть приложения.

  • Нужно защититься от бесконечных петель
  • Защита от появления новых тем.
  • Ограничить доступ к услугам и окружающей среде
    • Файловая система (пример: если рассерженный сценарист решил удалить файлы)
    • База данных (то же самое, что и удаление записей базы данных)

По сути, мне нужно настроить область видимости javascript так, чтобы она включала только то, что им нужно, и не более.

Ответы [ 6 ]

20 голосов
/ 16 апреля 2009

Чтобы защититься от бесконечных циклов, вы можете наблюдать за количеством команд во время выполнения скрипта (это работает только с интерпретированными скриптами, а не с скомпилированными).

В Rhino JavaDocs есть пример , который запрещает запуск скрипта более десяти секунд:

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }
13 голосов
/ 17 апреля 2009

Чтобы заблокировать доступ к классам и методам Java, взгляните на ...

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

10 голосов
/ 18 сентября 2008

Чтобы защититься от бесконечных циклов, вам нужно поместить его в отдельный процесс, чтобы его можно было убить.

Чтобы защититься от создания потоков, вам необходимо расширить SecurityManager (реализация по умолчанию разрешает ненадежному коду обращаться к группам потоков без полномочий root).

Безопасность Java позволяет вам запретить доступ к файловой системе.

Что касается ограничений базы данных, вы можете использовать стандартную пользовательскую безопасность SQL, но она довольно слабая. В противном случае вам необходимо предоставить API, который обеспечивает соблюдение ваших ограничений.

Редактировать: я должен отметить, что версия Rhino, поставляемая с JDK6, выполняла работу по обеспечению безопасности, но не включает компилятор.

1 голос
/ 07 мая 2011

Я только что наткнулся на это сообщение в блоге, которое кажется полезным для песочницы более или менее всего (не только Rhino):

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

0 голосов
/ 15 июля 2015

Если вы ищете только чистые функции JavaScript, вот решение, основанное на встроенной в JDK библиотеке Rhino без импорта сторонних библиотек:

  1. Узнайте имя класса фабрики обработчика сценариев JavaScript по ScriptEngineManager # getEngineFactories
  2. Загрузка класса фабрики обработчика сценариев в новый загрузчик классов, в котором JavaMembers или другие связанные классы будут игнорироваться.
  3. Вызовите #getScriptEngine в загруженной фабрике обработчиков сценариев и eval-сценарии в возвращенном обработчике сценариев.

Если данный скрипт содержит Java-скрипт, загрузчик классов попытается загрузить JavaMembers или другие классы и вызвать класс не найденных исключений. Таким образом, вредоносные скрипты будут игнорироваться без выполнения.

Пожалуйста, прочитайте файлы ConfigJSParser.java и ConfigJSClassLoader.java для более подробной информации:

https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config

0 голосов
/ 18 сентября 2008

Javascript является однопоточным и не может получить доступ к файловой системе, поэтому я не думаю, что вам нужно беспокоиться об этом. Я не уверен, есть ли способ установить тайм-аут для защиты от бесконечных циклов, но вы всегда можете создать поток (Java), который выполняет скрипт, а затем убить поток через столько времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...