現在、信頼できないJavaコードを実行するためにサンドボックスを作成しようとしています。このアイデアは、Javaアプリケーションがファイルシステムまたはネットワークソケットにアクセスするのを隔離することです。私が現在持っているソリューションは、IOやネットワークへのアクセスを禁止するSecurityManagerに書き直されています。Javaサンドボックス。 SecurityManagerを使用してI/Oアクセスをリダイレクトする
今私は呼び出しをファイルシステムにリダイレクトしたい、つまりアプリケーションが"/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を投げる以外、(名かファイルのような)方法で、内部変数を変更したり、何らかの形で実行順序に影響を与えることはできません。私は、内部フィールドにアクセスすることは、オブジェクト指向の原則に違反していることを理解しています。ローカル変数は、宣言されたメソッドの内部にのみ存在し、存在します。
私の質問は次のとおりです。Security Managerでファイルシステムへの呼び出しを置き換える方法はありますか?そうでない場合、これを行うために私が使用できる他の方法はありますか?
私は十分にはっきりしていたと思います。
答えに感謝します。最初のオプション私は自分のOSを1つのOSに制限したくないので、私は受け入れることができませんでしたが、2番目のオプションはかなりいいです。私はいくつかのAPIの置換を検索し、JMockitツールがクラスをモックしスタブを実行できることを発見しました。だから、基本的に私はそれを調べて、これが私が今必要としているものだと思う。 – Sevich