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