2012-03-05 10 views
6

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

+1

Там может быть полезной информацией от следующего вопроса (который имеет дело с немного сложнее ситуациями ненадежного кода Java): http://stackoverflow.com/questions/9041246/what-are-the-security-risk-i-should-guard-upon-when-running-user-provided-ja/9041423 # 9041423 – DNA

+0

Вы когда-нибудь получали ответ на этот вопрос? – ccleve

+0

Ничто не удовлетворило бы меня. Я решил просто построить его самостоятельно и узнать, как я иду. – VIBrunazo

ответ

1

Я мог бы рекомендовать встраивание Rhino, позволяя пользователю писать javascript. Он соответствует вашим критериям в (2), отлично представляя собой библиотеку java, которая позволяет запускать javascript (или запускать java из javascript).

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

У вас также есть преимущество, что, если ваша проблема требует этого, вы можете настроить его так, чтобы одни и те же выражения с радостью выполняли клиентскую или серверную сторону.

Более подробной информации о вложении Rhino, чтобы сделать то, что вам нужно в http://www.mozilla.org/rhino/tutorial.html#runScript