Я хочу, чтобы мое приложение оценивало выражение от ненадежного пользователя, которое я буду читать из файла JSON. Такие как:Как оценить выражения пользователя в песочнице
value = "(getTime() == 60) AND isFoo('bar')"
Я нашел много потоков об этом здесь, на StackOverflow. Обычно рекомендуется использовать собственный класс ScriptEngine Java, который может читать 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) Если единственное решение заключается в написании собственного оценщика выражений, то где я могу найти руководство по написанию согласованной модели безопасности? Я новичок в этом и понятия не имею, какие общие трюки используются для инъекций кода. Вот почему я хотел избежать необходимости писать это самостоятельно.
Там может быть полезной информацией от следующего вопроса (который имеет дело с немного сложнее ситуациями ненадежного кода Java): http://stackoverflow.com/questions/9041246/what-are-the-security-risk-i-should-guard-upon-when-running-user-provided-ja/9041423 # 9041423 – DNA
Вы когда-нибудь получали ответ на этот вопрос? – ccleve
Ничто не удовлетворило бы меня. Я решил просто построить его самостоятельно и узнать, как я иду. – VIBrunazo