2009-08-28 8 views
16

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

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

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

私は実行中のスクリプト内でアクセス/インスタンス化できるJavaクラスをホワイトリストに載せたいと思います。誰かがこれを達成するための例やドキュメントを教えてくれますか?

答えて

18

javax.scriptingはセキュリティフレームワークを提供していません。いくつかの検索の後、私は、JavaのdoPrivilegedActionフレームワークを使用しようとしていることを示唆しているGoogleのキャッシュ内の文書を見つけましたが、いくつかの実験の後で、スクリプトがソケットを開いたりファイルシステムにアクセスするのを防ぐことができませんでした。

私はこの質問をした後、StackOverflowでこれまでに質問されていたことが分かりました。How can you run Javascript using Rhino for Java in a sandbox?このページでは、JDK6に含まれるRhinoにセキュリティが既に適用されていると誤って示しています。私が指摘したように、私はスクリプトからソケットやその他の有害なアクションを開くことができました。

最後に私はjavax.scriptingを放棄し、Rhinoを直接埋め込んでいました。また、私は簡単に二つの結果を達成することができましたClassShutterあるカスタムContextFactory構築することにより:

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

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

2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/はRhinoをJSスクリプトエンジンとして使用するので、パッケージ名は異なるかもしれませんが、上記を使用できるはずです。

には、スクリプト作成にRhinoが必要なJavaアプリケーションを開発しています。アプリ は、信頼できないJavaScript コードをサードパーティから実行する必要があるため、私は のすべてのJava メソッドへのアクセスをブロックする必要がありました。 がLiveConnectを無効にする簡単な方法だった場合は問題ありません - スクリプトへのJavaアクセスを提供するRhinoの機能ですが、 はありません。

しかし、多くの掘削の後に 周り、私は最終的に行う方法を見つけた あまりにも多くのハッキングなし。 実際には、 いくつかのRhinoクラスを拡張し、 を使用して提供されたセッターを使用して、デフォルトのものの一部を無効にすることができます。

0

これは、Nashornという新しいエンジンを使用するjavax.scriptingの新しいJava 8実装で可能になりました。 Secure Nashorn JS Execution

関連する問題