16

javax.scriptingサーバー側でユーザーがアップロードした任意の JavaScript を実行するためのサポートを追加するために使用しています。明らかに、これらのスクリプトを保護したいのです!

Rhino 自体には、実行時にスクリプトを保護するためのフレームワークがあります。ただし、のドキュメントにjavax.scriptingは、セキュリティ、アクセス許可、またはスクリプトで使用できるクラスの制限については言及されていません。これは、javax.scriptingAPI が実行するスクリプトを保護するためのフレームワークを提供していないという API の単なる大きな穴ですか?

Rhino を直接使用したくはありません。もともと試してみたのですが、Java インスタンスを実行中のスクリプトに公開する際に問題があったためです。フレームワーク(javax.scriptingボンネットの下で Rhino を使用) により、この作業は簡単になり、マルチスレッド サーバーでのスクリプトの実行も簡素化されました。

実行中のスクリプト内でアクセス/インスタンス化できる Java クラスをホワイトリストに登録したいと考えています。これを達成する方法の例やドキュメントを教えてもらえますか?

4

3 に答える 3

18

javax.scriptingそれはセキュリティフレームワークを提供していないことが判明しました。いくつか検索しdoPrivilegedActionた後、Javaのフレームワークを使用することを提案するドキュメントをGoogleのキャッシュで見つけましたが、いくつかの実験の後、スクリプトがソケットを開いたりファイルシステムにアクセスしたりするのを防ぐためにこれを取得できませんでした。

この質問をした後、以前にStackOverflowで質問されていたことがわかりました。サンドボックスでRhino for Javaを使用してJavascriptを実行するにはどうすればよいですか? そのページでは、JDK6に含まれているRhinoのセキュリティがすでに機能していることを誤って示しています。私が示したように、スクリプトからソケットやその他の有害なアクションを開くことができました。

結局、私はRhinoを放棄javax.scriptingして直接埋め込みました。ContextFactory私もまたカスタムを構築することによりClassShutter、2つの結果を簡単に達成することができました。

  1. スクリプトの実行時間を最大制限時間に制限します
  2. クラスへのアクセスをホワイトリストに登録したものに制限します。これは基本的java.lang.*に、サーバーの階層内のいくつかのクラスを選択します。

CodeUtopia(新しいユーザーとして、1つの投稿で複数のページにリンクすることは許可されていないため、リンクできませんが、他のStackOverflow投稿でリンクされています)は、ClassShutterアーキテクチャとRhino独自のContextFactoryAPIを説明するのに役立ちました。このページでは、カスタムを作成する方法について説明していますContextFactory

于 2009-08-29T20:10:51.543 に答える
2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/は Rhino をサンドボックス化する方法を説明しており、javax.scripting は Rhino を JS スクリプト エンジンとして使用するため、ただし、パッケージ名は異なる場合があります。

私は、スクリプト作成に Rhino を必要とする Java アプリに取り組んできました。アプリは、サード パーティの信頼できない JavaScript コードを実行する必要があるため、必要なメソッドを除くすべての Java メソッドへのアクセスをブロックする方法を見つける必要がありました。LiveConnect (スクリプトへの Java アクセスを提供する Rhino の機能) を無効にする簡単な方法があれば、これは問題になりませんが、そのようなことはありません。

しかし、いろいろ調べた結果、あまりハッキングせずにこれを行う方法をついに見つけました。実際、いくつかの Rhino クラスを拡張し、提供されているセッターを使用してデフォルトのものをオーバーライドするだけで実現できます。

于 2009-10-21T18:00:05.730 に答える
0

参考までに、これは Nashorn と呼ばれる新しいエンジンを使用する javax.scripting の新しい Java 8 実装で可能になりました。安全な Nashorn JS の実行を参照してください。

于 2015-02-18T09:47:39.967 に答える