Я хочу, чтобы мое приложение оценивало выражение от ненадежного пользователя, который я буду читать из файла 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) Если единственным решением является написание моего собственного оценщика выражений, то где я могу найти руководство о том, как написать непротиворечивую модель безопасности? Я новичок в этом и понятия не имею, какие общие приемы используются для внедрения кода. Вот почему я хотел избежать необходимости писать это самостоятельно.