目前我正在尝试编写沙箱来运行不受信任的 Java 代码。这个想法是将 Java 应用程序与访问文件系统或网络套接字隔离开来。我目前的解决方案是重写 SecurityManager,它禁止对 IO 或网络的任何访问。
现在我不想禁止,而是将调用重定向到文件系统,即如果应用程序想要写入“/home/user/application.txt”,则文件的路径应该替换为“/temp/trusted_folder/”应用程序.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。我明白,访问内部字段违反了面向对象的原则,我明白,局部变量是可见的,并且只存在于声明它们的方法内部。
所以我的问题是:有什么方法可以让安全管理器替换对文件系统的调用?如果没有,我可以使用其他方法来做到这一点吗?
我希望我足够清楚。