我希望我的应用能够评估来自不受信任用户的表达式,我将从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)如果唯一的解决方案是编写我自己的表达式求值器,那么我在哪里可以找到一些关于如何编写一致安全模型的指导?我是新手,不知道代码注入常用的技巧是什么。这就是为什么我想避免必须自己写这个。
有可能是由以下问题(与不受信任的Java代码稍硬情况待遇)一些有用的信息:http://stackoverflow.com/questions/9041246/what-are-security-risks-i-should-guard-against-when-running-user-supplied-ja/9041423#9041423 – DNA 2012-03-05 21:15:43
你有没有得到过这个问题的答案? – ccleve 2013-04-17 20:04:59
什么都不会让我满意。我决定只是建立自己的,并随时了解。 – VIBrunazo 2013-04-18 20:25:17