21

ある程度信頼できる Java コードを呼び出す必要があり、そのコードの実行中にリフレクションを使用する機能を無効にしたいと考えています。

try{
   // disable reflection somehow
   someObject.method();
}
finally{
   // enable reflection again
}

これは SecurityManager で行うことができますか?

明確化/コンテキスト:これは、 JavaScript/Rhino から呼び出すことができるパッケージの制限に関する別の質問へのフォローアップです。受け入れられた回答は、その方法に関するブログ エントリを参照しており、2 つの手順が必要です。最初の手順は Rhino API (ClassShutter) を使用し、2 番目の手順はリフレクションと Class.forName() をオフにします。私は、SecurityManager を使用してその 2 番目のステップをよりクリーンに実行できると考えていました (指摘されているように、途中で複雑な獣である SecurityManager について学ぶこと)。

要約すると、(ファイルを設定するのではなく、コードから) Class.forName() とリフレクション パッケージ全体へのアクセスをオフにする必要があります。

4

3 に答える 3

20

何を制限しようとしているかによって異なります。

一般に、パブリックにアクセス可能な API は制限されていません。ただし、信頼できないコードに許可を与えない限りReflectPermission("suppressAccessChecks")、別のパッケージの非公開 API にアクセスすることはできません。

すべてのアクセスを制限したいパッケージのリストがある場合、2 つのステップがあります。まず、Securityプロパティで、リストに制限付きパッケージを含めますpackage.access。次に、信頼できるコードを提供しますRuntimePermission("accessClassInPackage." + pkg)

信頼できないコードを区別する一般的な方法は、別の場所からコードをロードし、アクセス許可を付与するときにポリシー ファイル内の別のコードベースを参照することです。

Java セキュリティー・アーキテクチャーは非常に強力ですが、複雑でもあることはわかっています。より具体的な例が必要な場合は、制限したい呼び出しを正確に説明してください。より明確にしようとします。


java.policyファイルやファイルを変更せずにやりたいことを行うのはjava.security非常に難しく、おそらく不可能です。はのjava.security.Policy情報を表しますがjava.policy、書き込みアクセスは提供されません。独自の実装を作成し、既存のもので許可Policyされている限り、実行時にインストールできます。SecurityManager

一方、カスタム java.policy ファイルをコマンドライン オプションとして指定できます。ある種のランチャーを備えた完全なアプリケーションを提供する場合、それは簡単に実現できます。また、ユーザーにある程度の透明性を提供します。熟練したユーザーは、アプリケーションに付与したいアクセス許可を確認できます。

于 2009-04-21T01:01:56.347 に答える
5

まあ、オーバーライドSecurityManager.checkMemberAccessしてより厳密な定義を与えることができます。しかし、実際にはそのようには機能しません。たとえば、コードがファイナライザーを定義している場合はどうなりますか?

明確化について: 他の API はリフレクションと他の API を使用します。たとえば、java.beans、LiveConnect、Rhino などです。敵対者は、スクリプト内から、たとえば、シャッターなしで新しい Rhino コンテキストを作成し、それによって完全な JRE にブートストラップすることができます。オープン システムでは、ブラックリストを完成させることはできません。

要約すると、Java セキュリティ モデルを使用するには、Java セキュリティ モデルに反対するのではなく、それを操作する必要があります。

于 2009-04-21T01:03:12.880 に答える
2

インスタンスごと、メソッドごと、フィールドごとにきめ細かいアクセス制御を可能にする ClassShutter の置き換えを作成しました。

http://riven8192.blogspot.com/2010/07/java-rhino-fine-grained-classshutter.html

于 2010-07-27T17:52:34.763 に答える