Как оценивать пользовательские выражения в песочнице

Я хочу, чтобы мое приложение оценивало выражение от ненадежного пользователя, который я буду читать из файла JSON. Например:

value = "(getTime() == 60) AND isFoo('bar')"

Я нашел много тем на эту тему здесь, на StackOverflow. Обычно рекомендуется использовать собственный класс Java ScriptEngine, который может читать JavaScript.Или рекомендуя пользователю либо использовать существующую библиотеку, такую ​​как JEXL, MVEL, либо любую другую из этого списка: http://java-source.net/open-source/expression-languages

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

value = "while(true)" // or
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL

И заблокировать мое приложение, или получить доступ к нежелательным ресурсам.

1) Можно ли легко настроить какую-либо из этих существующих библиотек, чтобы она могла работать в сейфе? Под «легко» я подразумеваю высокоуровневый API конфигурации, который мне будет быстрее использовать, чем писать собственный оценщик выражений. Проведя небольшое собственное исследование, похоже, что и JEXL, и MVEL отсутствуют.

2) Или существует язык выражений, который настолько прост, что его не может использовать ненадежный пользователь? Все те, которые я нашел, очень сложны и реализуют такие вещи, как циклы, операторы импорта и т. д. Все, что мне нужно, это анализировать математику, логические операторы и мои собственные определенные переменные и методы. Все, что сверх этого, не входит в мою компетенцию.

3) Если единственным решением является написание моего собственного оценщика выражений, то где я могу найти руководство о том, как написать непротиворечивую модель безопасности? Я новичок в этом и понятия не имею, какие общие приемы используются для внедрения кода. Вот почему я хотел избежать необходимости писать это самостоятельно.

7
задан VIBrunazo 5 March 2012 в 21:03
поделиться