36

Java アプリケーションの一部は、非開発者が作成した JavaScript を実行する必要があります。これらの非開発者は、データのフォーマットに JavaScript を使用しています。(単純なロジックと文字列の連結がほとんどです)。

私の質問は、これらのスクリプトの実行をセットアップして、スクリプト エラーがアプリケーションの残りの部分に大きな悪影響を及ぼさないようにする方法です。

  • 無限ループを防ぐ必要がある
  • 新しいスレッドの生成を防ぎます。
  • サービスと環境へのアクセスを制限する
    • ファイル システム (例: 不満を持ったスクリプト ライターがファイルを削除することにした場合)
    • データベース (データベース レコードを削除するのと同じこと)

基本的に、JavaScriptスコープを設定して、必要なものだけを正確に含め、それ以上は含めないようにする必要があります。

4

6 に答える 6

20

無限ループを防ぐために、スクリプトの実行中に命令カウントを観察できます (これは、解釈されたスクリプトでのみ機能し、コンパイルされたスクリプトでは機能しません)。

スクリプトが 10 秒以上実行されないようにするために、Rhino JavaDocs に次の例があります。

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }
于 2009-04-16T04:45:22.250 に答える
13

Java クラスとメソッド アクセスをブロックするには、以下を参照してください。

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

于 2009-04-17T13:04:14.757 に答える
10

無限ループを防ぐには、別のプロセスに配置して、強制終了できるようにする必要があります。

スレッドの作成を防ぐには、SecurityManager を拡張する必要があります (デフォルトの実装では、信頼されていないコードが非ルート スレッド グループにアクセスすることを許可します)。

Java セキュリティにより、ファイル システムへのアクセスを防ぐことができます。

データベースの制限については、標準の SQL ユーザー セキュリティを使用できる場合がありますが、これは非常に脆弱です。それ以外の場合は、制限を適用する API を提供する必要があります。

編集: JDK6 で提供される Rhino のバージョンにはセキュリティ作業が行われていますが、コンパイラは含まれていません。

于 2008-09-18T16:43:57.737 に答える
1

多かれ少なかれ(Rhinoだけでなく)サンドボックス化するのに役立つと思われるこのブログ投稿に出くわしました:

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

于 2011-05-06T21:25:54.767 に答える
0

純粋な JavaScript 関数のみを探している場合は、サードパーティのライブラリをインポートせずに、JDK に埋め込まれた Rhino ライブラリに基づくソリューションを次に示します。

  1. ScriptEngineManager#getEngineFactories で JavaScript スクリプト エンジン ファクトリ クラス名を調べる
  2. スクリプト エンジン ファクトリ クラスを新しいクラス ローダーにロードします。JavaMembers またはその他の関連クラスは無視されます。
  3. 読み込まれたスクリプト エンジン ファクトリで #getScriptEngine を呼び出し、返されたスクリプト エンジンでスクリプトを評価します。

指定されたスクリプトに Java スクリプトが含まれている場合、クラス ローダーは JavaMembers または他のクラスをロードしようとし、class not found 例外をトリガーします。このようにして、悪意のあるスクリプトは実行されずに無視されます。

詳細については、ConfigJSParser.java および ConfigJSClassLoader.java ファイルを参照してください。

https://github.com/webuzz/simpleconfig/tree/master/src/im/webuzz/config

于 2015-07-15T14:19:47.140 に答える
-9

Javascriptはシングルスレッドでファイルシステムにアクセスできないので、気にする必要はないと思います。無限ループを防ぐためにタイムアウトを設定する方法があるかどうかはわかりませんが、スクリプトを実行する (Java) スレッドをいつでも生成し、その後スレッドを強制終了することができます。

于 2008-09-18T16:09:13.777 に答える