現在、信頼できないJavaコードを実行するためのサンドボックスを作成しようとしています。アイデアは、Javaアプリケーションをファイルシステムまたはネットワークソケットへのアクセスから分離することです。私が現在持っている解決策は、IOまたはネットワークへのアクセスを禁止するSecurityManagerを書き直したものです。
ここで、禁止するのではなく、ファイルシステムへの呼び出しをリダイレクトします。つまり、アプリケーションが「/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にアクセスできず、SecurityExceptionをスローすることを除いて、メソッドの内部変数(nameやfileなど)を変更したり、実行順序に何らかの影響を与えたりすることはできません。内部フィールドへのアクセスはオブジェクト指向の原則に違反していることを理解しています。ローカル変数は表示され、宣言されたメソッド内にのみ存在することを理解しています。
だから私の質問は:Security Managerがファイルシステムへの呼び出しを置き換えることを可能にする方法はありますか?そうでない場合、これを行うために使用できる他のアプローチはありますか?
私は十分に明確だったと思います。