私は、java.policyファイルを設定することにより、JVMクラスへのアクセスを拒否することはできますか?
-
13-09-2019 - |
質問
私は私のjdk6\jre\lib\security\java.policy
ファイルへのAppEngineによってブラックリストに載っているいくつかのクラスを作成するための禁止を追加したいです。たとえば、私は、アプリケーションがjavax.naming.NamingException
をインスタンス化しようとしたときに私の地元のJVMが例外をスローします。
これは可能ですか?
私はここに私の特定の問題を説明しようとします。 Googleは、クラスを使用することができますどのように、いくつかの制約があり、サービス(GAE-のGoogleのApp Engine)を提供しています。例えばjavax.namingパッケージ内にあるJNDIクラスをインスタンス化しません。彼らはまた、私のマシン上でのテストにこのアプリケーションを使用することができますテストサーバーを提供していますが、このサーバは、このようなクラスを可能にし、コードをexacuteすることができます。あなたは、あなたがGoogleにアプリケーションをアップロードした後にのみブラックリストにクラスを使用したことを知ります。そのようなクラスのブラックリストの執行が開発JVM上で行うことができなかった場合、私は考えていました。他の私は、これは、彼らがすでに、このようなポリシーファイルを提供するかもしれない簡単だろうと考えています。
解決
あなたは、新しいrel="noreferrer"> href="http://www.javaworld.com/jw-03-2000/jw-03-classload.html" に。アプリケーションクラスは、このクラスローダを使用してロードすることができます。
アプリケーションは、あなたがブラックリストするクラスにアクセスしようとすると、カスタムクラスローダでは、あなたはその後、ClassNotFoundExceptionがスローすることができます。
あなたはload()メソッドをオーバーロードする必要があります。このメソッドは、クラスが許可されている場合、親クラスローダにordelegatingあなたのブラックリストに載っクラスに例外をスローする責任を負います。サンプル実装ます:
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);
}
(もちろん、実際の実装は、これよりもより洗練された方法ですることができます)。
、アプリケーションのクラスがこのクラスローダによってロードされ、そしてあなたは、あなたが必要とするすべてのクラスをブラックリストに載せることができますしたいときにだけはloadClass()親クラスローダにinvokationsを委任されているので。
私は、これは、Googleがそのサーバーのクラスをブラックリストに使用する方法であることをかなり確信しています。彼らは、特定のクラスローダにすべてのアプリケーションをロードします。また、これはTomcatが異なるWebアプリケーションを隔離する方法に似ています。
他のヒント
あなたはむしろランタイムエラーよりもコンパイルエラーを取得できませんか?あなたのIDEまたは望ましくないクラスがインスタンス化されたときに警告を表示するようにコンパイラを設定することができます。私は、AspectJのは、このためのいくつかの素晴らしい機能を持って知っている:あなたが参加するポイントにコンパイル警告/エラーを定義して、例えばにフィードバックを得ることができますEclipseの。 Eclipseでこれを使用するには、単にAspectJのプラグインをインストールし、適切な側面を記述します。コマンドラインまたはスクリプトからのコンパイル中にエラーを取得するには、あなたが実際にAspectJのコンパイラを使用する必要がありますが、私はあなたがそれを必要とすることを疑うます。
Javaドキュメントは、ここではすべての可能なポリシー権限を示しています。 http://java.sun.com/javase/ 6 /ドキュメント/技術情報/ガイド/セキュリティ/ permissions.htmlする
/ロードが記載されていないクラスの作成、私はあなたがポリシーを使用してこれを強制することはできませんと信じています。
いずれにせよ、なぜあなたは例外クラスがロードされたときに例外をスローするようにしたいですか?たぶん、あなたは、誰かが解決策を提案することができるかもしれない、あなたの問題を説明することができます。
の編集の
特定のクラスのロードを防止するための一つの方法は、JREのインストールからそれらを削除することです。ほとんどのシステムクラスは、あなたのJDK / JREのインストールでrt.jar内に含まれています。あなたは、任意のZIP-ツールでそれを修正することができる必要があります。
ちょうどあなたのJREの特別なインストールを作成し、そのrt.jarのを修正。これは醜いハックですが、テスト目的のためにOKする必要があります...