7

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

4

1 回答 1

1

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

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

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

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

于 2012-08-01T06:05:21.673 回答