Die Java-Sandbox ist eine Bibliothek zum Ausführen von Java-Code mit begrenzten Berechtigungen. Es kann verwendet werden, um nur auf eine Reihe von Klassen und Ressourcen auf der weißen Liste zuzugreifen. Es scheint nicht in der Lage zu sein, den Zugriff auf einzelne Methoden einzuschränken. Dazu wird ein System mit einem benutzerdefinierten Klassenladeprogramm und einem Sicherheitsmanager verwendet.
Ich habe es nicht benutzt, aber es sieht gut gestaltet und ziemlich gut dokumentiert aus.
@waqas hat eine sehr interessante Antwort gegeben, die erklärt, wie dies möglich ist, sich selbst zu implementieren. Es ist jedoch viel sicherer, solchen sicherheitskritischen und komplexen Code Experten zu überlassen.
Beachten Sie jedoch, dass das Projekt seit 2013 nicht mehr aktualisiert wurde und von den Erstellern als "experimentell" beschrieben wird. Die Homepage ist verschwunden, der Eintrag in Source Forge bleibt jedoch erhalten.
Beispielcode angepasst von der Projektwebsite:
SandboxService sandboxService = SandboxServiceImpl.getInstance();
// Configure context
SandboxContext context = new SandboxContext();
context.addClassForApplicationLoader(getClass().getName());
context.addClassPermission(AccessType.PERMIT, "java.lang.System");
// Whithout this line we get a SandboxException when touching System.out
context.addClassPermission(AccessType.PERMIT, "java.io.PrintStream");
String someValue = "Input value";
class TestEnvironment implements SandboxedEnvironment<String> {
@Override
public String execute() throws Exception {
// This is untrusted code
System.out.println(someValue);
return "Output value";
}
};
// Run code in sandbox. Pass arguments to generated constructor in TestEnvironment.
SandboxedCallResult<String> result = sandboxService.runSandboxed(TestEnvironment.class,
context, this, someValue);
System.out.println(result.get());
Thread.stop
verursacht Probleme im Java-Bibliothekscode. Ebenso erfordert der Java-Bibliothekscode Berechtigungen. Viel besser zuzulassen, dass dieSecurityManager
verwendenjava.security.AccessController
. Der Klassenlader sollte wahrscheinlich auch den Zugriff auf die eigenen Klassen des Benutzercodes ermöglichen.