В настоящее время я пытаюсь написать Песочницу для запуска ненадежного кода Java. Идея состоит в том, чтобы изолировать Java-приложение от доступа к файловой системе или сетевым сокетам. Решение, которое у меня есть на данный момент, переписано SecurityManager, которое запрещает любой доступ к IO или сети.
Теперь я хочу не запрещать, а перенаправлять вызовы в файловую систему, т. Е. Если приложение хочет записать в "/ home / user / application.txt" путь к файлу, который необходимо заменить с чем-то вроде "/ temp /rust_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 заменять вызовы в файловой системе? Если нет, есть ли другие подходы, которые я могу использовать для этого?
Надеюсь, я был достаточно ясен.