如何在沙盒中评估用户表达式

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)如果唯一的解决方案是编写自己的表达式求值器,那么在哪里可以找到关于如何编写一致的安全模型的指导?我对此不太熟悉,也不知道代码注入使用的常见技巧。这就是我想避免自己编写的原因。


1
以下问题可能有一些有用的信息(处理不可信任的Java代码的较困难情况):https://dev59.com/aV_Va4cB1Zd3GeqPWse_#9041423 - DNA
你有没有得到这个问题的答案? - ccleve
没有什么能让我满意。我决定自己构建并边学边做。 - VIBrunazo
1个回答

1
我可以推荐嵌入Rhino,使用户能够编写JavaScript。它完美地符合您在(2)中的标准,因为它是一个Java库,可以让您运行JavaScript(或从JavaScript运行Java)。您可以设置上下文,用户只能访问您放入上下文或从中可访问的内容。JavaScript表达式可以像您上面展示的最简单的情况一样简单,也可以变得非常复杂。嵌入Rhino并公开有限的对象集是在过去的项目中实现各种用户脚本的好方法,而且Rhino现在已经非常成熟了。
您还有一个优势,即如果您的问题需要,您可能很容易将其设置为相同的表达式可以在客户端或服务器端愉快地运行。
有关嵌入Rhino以实现您所需功能的更多信息,请参见http://www.mozilla.org/rhino/tutorial.html#runScript

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接