Java-Sandbox библиотека для выполнения Java - кода с ограниченным набором разрешений. Его можно использовать для разрешения доступа только к набору классов и ресурсов из белого списка. Кажется, он не может ограничить доступ к отдельным методам. Для этого используется система с настраиваемым загрузчиком классов и менеджером безопасности.
Я не использовал его, но он выглядит хорошо продуманным и достаточно хорошо документированным.
@waqas дал очень интересный ответ, объясняющий, как это можно реализовать самостоятельно. Но гораздо безопаснее оставить такой критически важный для безопасности и сложный код экспертам.
Заметим, однако, что проект не обновлялся с 2013 года, и создатели называют его «экспериментальным». Его домашняя страница исчезла, но запись Source Forge осталась.
Пример кода, адаптированный с веб-сайта проекта:
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
вызовет проблемы в коде библиотеки Java. Точно так же для кода библиотеки Java потребуются разрешения. Намного лучше позволитьSecurityManager
использоватьjava.security.AccessController
. Загрузчик классов, вероятно, также должен разрешать доступ к собственным классам пользовательского кода.