[英]java expression language that can't access 'unsafe' java methods
我正在开展一个项目,我将让用户向服务器提交小“脚本”,然后我将执行这些脚本。 有许多脚本语言可以嵌入到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);
}
构建一个功能正常的沙箱很困难。 你可以做的是使用一个自定义类加载器,它只允许从父类中选择几种类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.