我知道,我可以在JEXL中做几件事,但无法在其中找到过滤器功能,这确实非常有用.
我该怎么办呢
var x=[{a:11,b=5},{a:1,b=15},{a:12,b=25},{a:4,b=35},{a:7,b=45}];
return x[.a>10].b; // Which filters to {a:11,b=5} & {a:12,b=25}
// & hence returns [5,25]
Run Code Online (Sandbox Code Playgroud) 我希望我的应用程序评估来自不受信任的用户的表达式,我将从JSON文件中读取.如:
value = "(getTime() == 60) AND isFoo('bar')"
Run Code Online (Sandbox Code Playgroud)
我在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
Run Code Online (Sandbox Code Playgroud)
并锁定我的应用程序,或访问不需要的资源.
1)那些现有的库中是否能够轻松配置以便它可以在安全的盒子上运行?通过"轻松",我的意思是高级配置API,我使用它比编写自己的表达式求值程序更快.在做了一些我自己的研究后,JEXL和MVEL似乎都出局了.
2)或者是否存在一种非常简单的现有表达式语言,以至于它不能被不受信任的用户利用?我发现的所有内容都非常复杂,并且实现了循环,导入语句等等.我只需要解析数学,逻辑运算符和我自己定义的变量和方法.除此之外的任何事情都超出了我的范围.
3)如果唯一的解决方案是编写自己的表达式求值程序,那么在哪里可以找到有关如何编写一致的安全性模型的指导?我是新手,并不知道代码注入的常用技巧是什么.这就是为什么我想避免不得不自己写这个.
我正在为JEXL脚本创建一个沙箱来执行,以便恶意用户无法访问我们允许他们访问的变量之外的数据,也无法在服务器上执行DOS攻击.我想把这个记录给任何其他人也这样做,并且也让其他人对这种方法有所了解.
以下是我所知道的需要解决的事项列表:
这不适用于JEXL,但可能适用于您使用的脚本语言:
如何在JXL中添加自定义字体?除了默认可用的之外?
public static final FontName ARIAL = new FontName("Arial");
public static final FontName TIMES = new FontName("Times New Roman");
public static final FontName COURIER = new FontName("Courier New");
public static final FontName TAHOMA = new FontName("Tahoma");
Run Code Online (Sandbox Code Playgroud)
该类FontName似乎是类private static内部的内部类WritableFont。除了那里提到的字体之外,如何添加字体?
问候,A Y.
有没有人有任何使用循环的简单 JEXL 示例。我希望围绕一个简单的对象数组列表进行迭代以输出各种字符串值?
我使用JEXL库来计算具有不同参数的数学表达式(例如,y = 2x + a ^ 2-4*a*x其中(x = 1&a = 3),(x = 5&a = -15)等).它在简单的表达式上运行良好,但是当我开始使用更多的硬表达式时 - 它不起作用.这是代码运作良好:
JexlEngine jexl = new JexlEngine();
Expression func = jexl.createExpression("x1+x2");
MapContext mc = new MapContext();
mc.set("x1", 2);
mc.set("x2", 1);
System.out.println(func.evaluate(mc)); // prints "3" - GOOD ANSWER!
Run Code Online (Sandbox Code Playgroud)
但这一个打印错误答案:
JexlEngine jexl = new JexlEngine();
Expression func = jexl.createExpression("(x1-2)^4+(x1-2*x2)^2");
MapContext mc = new MapContext();
mc.set("x1", 2);
mc.set("x2", 1);
System.out.println(func.evaluate(mc)); // prints "6" - WRONG ANSWER!
Run Code Online (Sandbox Code Playgroud)
我做错了什么?