我对 java-sandbox API 有点挣扎.考虑以下代码:
Sandkiste.java:
import java.util.List;
import java.util.concurrent.TimeUnit;
import net.datenwerke.sandbox.*;
import net.datenwerke.sandbox.SandboxContext.AccessType;
import net.datenwerke.sandbox.SandboxContext.RuntimeMode;
import net.datenwerke.sandbox.handlers.BadThreadKillHandler;
public class Sandkiste {
public static void main(String[] args) {
Sandkiste s = new Sandkiste();
s.run();
}
public void run(){
SandboxService sandboxService = SandboxServiceImpl.getInstance();
/* configure context */
SandboxContext context = new SandboxContext();
context.addClassForApplicationLoader("Test");
context.addClassPermission(AccessType.PERMIT, "Test");
context.addClassPermission(AccessType.PERMIT,UntrustedCode.class.getName());
context.addClassPermission(AccessType.DENY, "java.lang.System");
context.addClassPermission(AccessType.DENY, "java.io.PrintStream");
context.setRunInThread(true);
/* run code in sandbox */
SandboxedCallResult<List<String>> result = sandboxService.runSandboxed(UntrustedCode.class, context);
/* output result */
}
}
UntrustedCode.java:
import java.util.List;
import net.datenwerke.sandbox.SandboxedEnvironment;
public class UntrustedCode implements SandboxedEnvironment<List<String>> {
@Override
public List<String> execute() throws Exception {
Test t = new Test();
t.print();
return null;
}
}
测试.java:
public class Test {
public void print() {
System.out.println("Erlaubt!");
}
}
我想拒绝在沙箱中执行的所有类中访问 System.class 但是 尽管拒绝了 System.class 的许可,类“Test”仍然能够调用 System.class 的方法。有没有办法实现这一点?
最佳答案
我认为你应该删除这条线
context.addClassForApplicationLoader("Test");
我只能猜测,但看起来它使 Test
类的行为不受 SandBox 的控制,而是在“正常”类加载器的控制下。
关于Java Sandbox API - 拒绝访问已使用的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27524636/