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