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