java表达式语言,无法访问’不安全’的java方法

我正在开展一个项目,我将让用户向服务器提交小“脚本”,然后我将执行这些脚本。 有许多脚本语言可以嵌入到Java程序中,例如mvel,ognl,uel,clojure,rhino javascript等,但据我所知,它们都允许脚本编写者调用Java构造函数,静态方法等

我不希望我的用户能够调用任何我没有提供它们的东西(通常通过某种上下文对象)。 他们的大多数脚本都是算术和逻辑表达式,在某些情况下,他们需要遍历对象属性(getter / setter)或Map的内容。 我只是不希望他们逃离我提供的沙箱。

有什么建议么?

我认为你可以通过使用安全 策略来实现这一目标 。

只是:

//Remember old one ClassLoader orginalClassLoader = Thread.currentThread().getContextClassLoader(); //Set my classloader ClassLoader myClassLoader = new SecureMVELClassLoader(); Thread.currentThread().setContextClassLoader(myClassLoader); System.out.println(MVEL.eval("new com.myapp.insecure.InsecureClass()")); //Set back to original classloader Thread.currentThread().setContextClassLoader(orginalClassLoader); 

在我的classLoader中

 public class SecureMVELClassLoader extends ClassLoader { @Override public Class loadClass(String name) throws ClassNotFoundException { //some filter logic here if (name.startsWith("com.myapp.insecure.")) throw new ClassNotFoundException(); return super.loadClass(name); } 

构建一个function正常的沙箱很困难。 您可以使用自定义类加载器,只允许从父项中选择几种类型。