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

时间:2009-06-27 02:03:33

标签: java scripting

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我认为您可以使用security policy来实现这一目标。

答案 1 :(得分:2)

只是:

  //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);
 }

答案 2 :(得分:1)

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