5

jdk6\jre\lib\security\java.policyappengine によってブラックリストに登録されているいくつかのクラスを作成するための禁止をファイルに追加したいと考えていました。たとえば、アプリケーションがインスタンス化しようとしたときに、ローカル jvm が例外をスローするようにしますjavax.naming.NamingException

可能です?

私はここで私の特定の問題を説明しようとします。Google が提供するサービス (GAE-google アプリ エンジン) では、使用できるクラスに制限があります。たとえば、javax.naming パッケージにある JNDI クラスはインスタンス化されません。また、私のマシンでこのアプリケーションをテストするために使用できるテストサーバーも提供していますが、このサーバーはそのようなクラスを許可し、コードを実行できます。アプリケーションを Google にアップロードして初めて、ブラックリストに登録されたクラスを使用したことがわかりました。そのようなクラスのブラックリストの強制が開発 jvm で実行できないかどうかを考えていました。そうでなければ、すでにそのようなポリシーファイルを提供している可能性があるので、これは簡単だと思います。

4

3 に答える 3

6

新しいカスタム classloaderを作成する小さなローダー アプリケーションを作成できます。その後、このクラスローダーを使用してアプリケーション クラスをロードできます。

カスタム クラスローダーでは、アプリケーションがブラックリストに登録するクラスにアクセスしようとしたときに ClassNotFoundException をスローできます。

load() メソッドをオーバーロードする必要があります。このメソッドは、ブラックリストに登録されたクラスで例外をスローするか、クラスが許可されている場合は親 Classloader に委譲します。サンプル実装:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}

(もちろん、実際の実装はこれよりもはるかに洗練されたものになる可能性があります)

アプリケーションのクラスはこの Classloader を介してロードされ、必要なときにのみ loadClass() 呼び出しを親クラスローダーに委譲しているため、必要なクラスをブラックリストに登録できます。

これは、Google がサーバー内のクラスをブラックリストに登録するために使用する方法であると確信しています。特定のクラスローダーにすべてのアプリをロードします。これは、Tomcat がさまざまな Web アプリケーションを分離する方法にも似ています。

于 2009-06-17T14:57:38.080 に答える
1

プログラムのテスト中に実行時エラーよりもコンパイル エラーが発生したいと思いませんか? 望ましくないクラスがインスタンス化されたときに警告するように IDE またはコンパイラを構成できます。AspectJ にはこのための優れた機能がいくつかあることは知っています。結合ポイントでコンパイルの警告/エラーを定義し、Eclipse などでフィードバックを得ることができます。これを Eclipse で使用するには、AspectJ プラグインをインストールして適切なアスペクトを作成するだけです。コマンドラインまたはスクリプトからコンパイル中にエラーを取得するには、実際には AspectJ コンパイラを使用する必要がありますが、それが必要になるとは思えません。

于 2009-06-19T19:11:48.177 に答える
0

Javaのドキュメントには、考えられるすべてのポリシー権限がここにリストされています:http: //java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

クラスの作成/読み込みについては触れられていないため、ポリシーを使用してこれを強制することはできないと思います。

とにかく、例外クラスがロードされたときになぜ例外をスローしたいのですか?多分あなたはあなたの問題を説明することができ、そして誰かが解決策を提案することができるかもしれません。

編集:

特定のクラスのロードを防ぐ1つの方法は、JREインストールからそれらを削除することです。ほとんどのシステムクラスは、JDK/JREインストールのrt.jarに含まれています。どのZIPツールでも変更できるはずです。

JREの特別なインストールを作成し、そのrt.jarを変更するだけです。これは醜いハックですが、テスト目的では問題ないはずです...

于 2009-06-15T00:06:08.697 に答える