如何评估沙箱中的用户表达式

时间:2012-03-05 21:03:33

标签: java android json mvel jexl

我希望我的应用评估来自不受信任的用户的表达式,我将从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 个答案:

答案 0 :(得分:1)

我可以推荐嵌入Rhino,让用户可以编写javascript。它符合您的标准(2)完美地成为一个java库,使您能够运行javascript(或从javascript运行java)。

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

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

有关嵌入Rhino以在http://www.mozilla.org/rhino/tutorial.html#runScript

完成所需内容的更多信息