В настоящее время я пытаюсь написать песочницу для запуска ненадежного кода Java. Идея состоит в том, чтобы изолировать приложение Java от доступа к файловой системе или сетевым сокетам. Решение, которое у меня есть на данный момент, - это переписанный SecurityManager, который запрещает любой доступ к вводу-выводу или сети.
Теперь я хочу не запрещать, а перенаправлять вызовы в файловую систему, т.е. если приложение хочет записать в «/ home / user / application.txt» , путь к файлу следует заменить что-то вроде "/ temp / trust_folder / application.txt" . Итак, в основном я хочу разрешить приложениям получать доступ к файловой системе только в какой-то конкретной папке и перенаправлять все другие вызовы в эту папку.
Вот метод из класса FileOutputStream , где SM спрашивают, есть ли разрешение на запись по заданному пути.
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(name);
}
if (name == null) {
throw new NullPointerException();
}
fd = new FileDescriptor();
fd.incrementAndGetUseCount();
this.append = append;
if (append) {
openAppend(name);
} else {
open(name);
}
}
Очевидно, SM не имеет доступа к FileOutputStream и не может изменять внутренние переменные в методе (например, name или file ]) или каким-либо образом повлиять на порядок выполнения, кроме выброса SecurityException. Я понимаю, что доступ к внутренним полям является нарушением объектно-ориентированных принципов, я понимаю, что локальные переменные видны и существуют только внутри метода, в котором они были объявлены.
У меня вопрос: есть ли способы разрешить Security Manager заменять вызовы файловой системы? Если нет, могу ли я использовать другие подходы для этого?
Надеюсь, я был достаточно ясен.