Java-Sandbox jest biblioteką do wykonywania kodu Java z ograniczonego zestawu uprawnień. Można go użyć, aby umożliwić dostęp tylko do zestawu klas i zasobów z białej listy. Wydaje się, że nie jest w stanie ograniczyć dostępu do poszczególnych metod. Aby to osiągnąć, wykorzystuje system z niestandardowym programem ładującym klasy i menedżerem bezpieczeństwa.
Nie używałem go, ale wygląda na dobrze zaprojektowany i dość dobrze udokumentowany.
@waqas udzielił bardzo interesującej odpowiedzi wyjaśniającej, jak można to zrealizować samodzielnie. Ale znacznie bezpieczniej jest pozostawić taki krytyczny i złożony kod z punktu widzenia bezpieczeństwa ekspertom.
Zwróć jednak uwagę, że projekt nie był aktualizowany od 2013 roku, a twórcy określają go jako „eksperymentalny”. Jego strona główna zniknęła, ale wpis Source Forge pozostał.
Przykładowy kod zaadaptowany ze strony internetowej projektu:
SandboxService sandboxService = SandboxServiceImpl.getInstance();
SandboxContext context = new SandboxContext();
context.addClassForApplicationLoader(getClass().getName());
context.addClassPermission(AccessType.PERMIT, "java.lang.System");
context.addClassPermission(AccessType.PERMIT, "java.io.PrintStream");
String someValue = "Input value";
class TestEnvironment implements SandboxedEnvironment<String> {
@Override
public String execute() throws Exception {
System.out.println(someValue);
return "Output value";
}
};
SandboxedCallResult<String> result = sandboxService.runSandboxed(TestEnvironment.class,
context, this, someValue);
System.out.println(result.get());
Thread.stop
spowoduje problemy w kodzie biblioteki Java. Podobnie kod biblioteki Java będzie wymagał uprawnień. Znacznie lepiej pozwolić naSecurityManager
użyciejava.security.AccessController
. Program ładujący klasy powinien prawdopodobnie również umożliwiać dostęp do własnych klas kodu użytkownika.