2016-10-21 3 views
0

Я пишу приложение, в котором пользователь может предоставить пользовательский Javascript функция фильтрации файлов на стороне сервера с помощью Насхорн/JJS:Nashorn/JJS безопасности: выполнение сценария пользователя на стороне сервера

cat /etc/js/library.js user.js > tmp.js && 
cat /path/to/input.txt | jjs --language=es6 -doe -J-Djava.security.manager tmp.js > /path/to/output.txt && 
rm tmp.js 

Я знаю, что пользователь может написать бесконечный цикл, чтобы заполнить мой диск:

for(;;) print("#####); 

Но -J-Djava.security.manager достаточно, чтобы предотвратить его для чтения/записи файла в файловой системе?

Спасибо.

ответ

2

Вы правы. После того, как вы установите java security manager, ваши скрипты будут «изолированы». Если вы не пишете явную политику безопасности, где вы предоставляете конкретные разрешения для определенных сценариев, для сценариев даются только разрешения для песочницы. Вы можете безопасно запускать незащищенные сценарии. Чтобы предоставить определенные разрешения на конкретные скрипты, вам необходимо загрузить скрипт из доверенных веб-адресов и использовать эти URL-адрес в области политики безопасности:

Смотрите также: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+script+security+permissions

+0

Спасибо, но не это парадоксальное, что JJS все еще в состоянии читать файл сценария 'tmp.js'? (или активируется безопасность после * чтения этого js-файла?) – Pierre

+1

Нет, сам код jjs предоставляется по умолчанию для политики AllPermission. Это код jjs, который считывает начальный набор файлов, указанных в командной строке, и поэтому он согласован. Если ваш сценарий вызывает «load» примитив для загрузки дополнительных скриптов, также будут вступать в силу разрешения безопасности вашего сценария (сценарий загрузки). –