java - 如何评估沙盒中的用户表达式

标签 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) 如果唯一的解决方案是编写我自己的表达式求值器,那么我在哪里可以找到有关如何编写一致的安全模型的指导?我对此很陌生,不知道用于代码注入(inject)的常用技巧是什么。这就是为什么我不想自己写这个。

最佳答案

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

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

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

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

关于java - 如何评估沙盒中的用户表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573950/

相关文章:

c# - JavaScriptSerializer - 枚举的 JSON 序列化为字符串

java - 是否可以将数据库表与事务中的读取操作隔离开来?

java - 如何将设备上的 CET 时间转换为本地时间?

java - 如何在 Android 中将 TextView 添加到 LinearLayout

java - 是否可以仅更改 TextView 的一部分?

android - drawable.setColorFilter 标记为已弃用

java - 将项目添加到 fragment 中的 ListView 中

javascript - Ajax:rest api 调用给出错误:未捕获的语法错误:意外的标记:

java - 获取JSON对象的具体对象(XML类型)

java - hibernate加速插入