2012-03-05 84 views
6

我希望我的应用能够评估来自不受信任用户的表达式,我将从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)如果唯一的解决方案是编写我自己的表达式求值器,那么我在哪里可以找到一些关于如何编写一致安全模型的指导?我是新手,不知道代码注入常用的技巧是什么。这就是为什么我想避免必须自己写这个。

+1

有可能是由以下问题(与不受信任的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

+0

你有没有得到过这个问题的答案? – ccleve 2013-04-17 20:04:59

+0

什么都不会让我满意。我决定只是建立自己的,并随时了解。 – VIBrunazo 2013-04-18 20:25:17

回答

1

我可以推荐嵌入Rhino,使用户能够编写javascript。它符合你的条件(2)完全成为一个Java库,使您可以运行JavaScript(或从JavaScript运行Java)。

您设置了一个上下文,用户只能访问您在上下文中放置的内容或从中访问。 JavaScript表达式可以像上面显示的最简单的情况那样简单,或者可以像他们需要的那样复杂。嵌入Rhino并展示一组有限的对象是在过去的项目中启用各种用户脚本的好方法,而那在几年前,Rhino现在已经非常成熟。

您还有一个优点,即如果您的问题需要它,您可以很好地设置它,以便相同的表达式能够愉快地运行客户端或服务器端。

上嵌入犀牛来完成你需要在http://www.mozilla.org/rhino/tutorial.html#runScript什么更多信息