Я ищу для запуска некоторые не проверенные сценарии (написанные на языке, который еще не определен, но должен быть основан на Java, поэтому JRuby, Groovy, Jython, BeanShell и т. д. - все кандидаты). Я хочу, чтобы эти сценарии могли делать что-то и ограничивались другими делами.Безопасность с помощью Java-скриптов (JRuby, Jython, Groovy, BeanShell и т. Д.)
Обычно я просто использую SecurityManager для Java и делаю это с ним. Это довольно просто и позволяет мне ограничить доступ к файлам и сети, возможность отключения JVM и т. Д. И это будет хорошо работать для материалов высокого уровня, которые я хочу заблокировать.
Но есть некоторые вещи, которые я хочу разрешить, но только через свой пользовательский API/библиотеку, которую я предоставляю. Например, я не хочу разрешать прямой доступ к сети, чтобы открыть URLConnection на yahoo.com, но я в порядке, если это делается с MyURLConnection. То есть - есть набор методов/классов, которые я хочу разрешить, а затем все остальное, что я хочу быть вне пределов.
Я не считаю, что этот тип безопасности может быть выполнен со стандартной моделью безопасности Java, но, возможно, это возможно. У меня нет особых требований к производительности или гибкости самого языка сценариев (скрипты будут простыми процедурными вызовами для моего API с базовым циклом/ветвлением). Таким образом, даже «большие» накладные расходы, которые проверяют проверку безопасности на каждый вызов отражения, мне в порядке.
Предложения?
Спасибо, что очень полезно. Btw - прецедент для меня - позволить людям загружать скрипты для своих нагрузочных тестов для запуска на http://browsermob.com. Я не смотрел на Rhino, но похоже, что он может работать до тех пор, пока он не разрешает прямой доступ к API Java, например, Groovy. –
Да, у вас там больше контроля, что хорошо с точки зрения безопасности. Возможно, вам придется создавать оболочки для определенных API, а затем выставлять эти объекты. Например, у нас есть механизм рабочего процесса и создан объект рабочего процесса, который мы затем подвергли JavaScript, который контролирует то, что вы можете сделать. –
Быстрое наблюдение: как вы убедились, что переменная Packages недоступна? См. Http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –