14

JSR-223 をサンドボックス化しようとしています。具体的には、どのスクリプトも自分のクラスにアクセスできないようにしたいと考えています。(Rhino は ClassShutter でそれを行うことができると聞きましたが、私は一般的に、つまり JSR-223 のすべてのスクリプト エンジンに対してそれを行いたいと考えています)。

私は最初に、アクセス許可をまったく渡さずAccessController.doPrivilegedに、ソリューションを使用しようとしました。ほとんどのパーミッションで機能しますが、スクリプトは引き続きすべてのパブリック クラスにアクセスできます (「パッケージ アクセス」パーミッションを無視しているようです ...?)。

私はこれを見つけました。私の質問は、スクリプト エンジンにカスタム ClassLoader をインストールするにはどうすればよいですか? (または、必要に応じて ClassLoader をグローバルに置き換えるにはどうすればよいですか?)

4

3 に答える 3

8

クラスローダーを使用するScriptEngineManagerのコンストラクターがあります。クラスローダーは、スクリプトエンジンの実装をロードするために使用されます。クラスはクラスローダーを継承するため、スクリプトエンジンとそれが作成するオブジェクトもそのクラスローダーを使用する必要があります。

そのクラスローダーは、ホワイトリストに登録されていないクラスの存在を拒否する必要があります。

カスタムSecurityManagerで締めくくり、使用中のクラスローダーに基づいてアクセスチェックを行うことができます。

編集:これは、JavaのSandboxingRhinoで見つけた記事です。そのほとんどはJSR-223にも当てはまります。Sunの実装はRhinoに変更が加えられているため、いくつかの違いがある場合があります。

于 2009-09-10T22:28:22.627 に答える
0

別の JVM でスクリプト エンジンを必要とするアプリケーションの一部を実行することは可能ですか? 別のクラスパス (およびセキュリティ マネージャー) を使用してスクリプト エンジン JVM を起動し、2 つの JVM 間でなんらかの形式の軽量メッセージ パッシングを使用することができます。

于 2009-09-09T13:45:04.620 に答える
0

http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.javaおよび同じパッケージ内の関連クラス、特に SANDBOXING_FACTORYを参照してください。

これは、rhino インタープリターをサンドボックス化して、ローダーが仲介するファイルシステムにアクセスできるようにするコードです。

于 2011-04-02T00:32:57.957 に答える