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

VIB*_*azo 7 java android json mvel jexl

我希望我的应用程序评估来自不受信任的用户的表达式,我将从JSON文件中读取.如:

value = "(getTime() == 60) AND isFoo('bar')"
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

并锁定我的应用程序,或访问不需要的资源.

1)那些现有的库中是否能够轻松配置以便它可以在安全的盒子上运行?通过"轻松",我的意思是高级配置API,我使用它比编写自己的表达式求值程序更快.在做了一些我自己的研究后,JEXL和MVEL似乎都出局了.

2)或者是否存在一种非常简单的现有表达式语言,以至于它不能被不受信任的用户利用?我发现的所有内容都非常复杂,并且实现了循环,导入语句等等.我只需要解析数学,逻辑运算符和我自己定义的变量和方法.除此之外的任何事情都超出了我的范围.

3)如果唯一的解决方案是编写自己的表达式求值程序,那么在哪里可以找到有关如何编写一致的安全性模型的指导?我是新手,并不知道代码注入的常用技巧是什么.这就是为什么我想避免不得不自己写这个.

小智 1

我建议嵌入 Rhino,使用户能够编写 javascript。它完全符合您在 (2) 中的标准,它是一个 Java 库,使您能够运行 javascript(或从 javascript 运行 java)。

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

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

有关嵌入 Rhino 来完成您所需任务的更多信息,请访问http://www.mozilla.org/rhino/tutorial.html#runScript