Подтвердить что ты не робот

Как защитить скрипты с помощью javax.scripting?

Я использую javax.scripting, чтобы добавить поддержку для запуска произвольных загружаемых пользователем Java-скриптов на стороне сервера. Очевидно, я хочу защитить эти сценарии!

Rhino, сам по себе, имеет структуру для обеспечения безопасности скриптов во время выполнения. Однако в документации для javax.scripting не указывается безопасность, разрешения или ограничения классов, доступных для script. Так это просто огромная дыра в API javax.scripting, что он не предлагает фреймворк для защиты выполняемых им сценариев?

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

Я хотел бы использовать классы Java white-list, к которым можно получить доступ/создать экземпляр в рамках script. Может ли кто-нибудь указать мне пример или документацию о том, как это сделать?

4b9b3361

Ответ 1

Оказывается, javax.scripting не предлагает рамки безопасности. После некоторого поиска я нашел документ в кеше Google, который предложил попробовать использовать инфраструктуру Java doPrivilegedAction, но после некоторых экспериментов мне не удалось это предотвратить, чтобы скрипты не открывали сокеты или не обращались к файловой системе.

После того, как я задал этот вопрос, я обнаружил, что он ранее задавался здесь в StackOverflow: Как запустить Javascript с помощью Rhino для Java в изолированной программной среде? На этой странице ложно указывает на то, что Rhino, входящий в состав JDK6, уже работает. Как я уже сказал, я смог открыть сокеты и другие вредоносные действия из script.

В конце концов я отказался от javax.scripting и встроенного Rhino напрямую. Создав пользовательский ContextFactory, который также является ClassShutter, мне удалось добиться двух результатов:

  • Ограничивает script время выполнения до максимального срока
  • Ограничивает доступ класса к тем, у кого есть белый список, который в основном java.lang.* и несколько классов в моей иерархии серверов.

CodeUtopia (с которым я не могу ссылаться, потому что, как новый пользователь, мне не разрешено ссылаться на несколько страниц в одном сообщении, но оно связано с другим сообщением StackOverflow) было ценным при описании ClassShutter архитектура и собственный интерфейс ContextFactory на Rhino описывает, как создать пользовательский ContextFactory.

Ответ 2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ описывает способ носорога песочницы, а javax.scripting использует Rhino как JS script, поэтому вы должны быть способный использовать вышеупомянутое, хотя имена пакетов могут отличаться.

Я работал над Java-приложением, которое нужен Rhino для скриптинга. Приложение потребуется запустить ненадежный JavaScript код от третьих сторон, поэтому мне пришлось найти способ блокировать доступ ко всем Java методы, за исключением тех, которые я хотел. Это не будет проблемой, если был простым способом отключить LiveConnect - функция Rhino, которая предоставляет java-доступ к скриптам, - но есть нет такой вещи.

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

Ответ 3

FYI, теперь это возможно в новой реализации Java 8 javax.scripting, которая использует новый движок под названием Nashorn. См. Безопасное выполнение JS Nashorn