私はサンドボックス化されたJS環境を実装しています。ユーザーはJSコードをアップロードし、一連のルールに基づいて起動できます。サンドボックスのNashornコンテナを安全に再利用する
I Nashorn環境から無効Javaアクセスのみなどによってアップロードされた各JSコードのためのHTTPリクエスト、base64エンコードなど
現在、私はScriptEngine
(Nashorn環境)を作成するなど、いくつかの操作のためのいくつかのユーティリティクラスにアクセスできるように私たちの環境では、ほとんどのユーザが使用する多くの事前定義されたJSコードがあります。 ScriptEngine
の作成は高価なので、同じJSコードブロックに対してScriptEngine
を再利用したいと思います。ユーザーが、次のコードをアップロードしたとしましょう:環境変数に似ています
userContext
、彼女のコードをアップロードするときに、ユーザーがコンテキスト変数を設定し、我々はmain
関数に渡します。 JSコードはmain以外の変数を持っていないので、ステートレスなので、コンテナを再利用するのは簡単です。私は、各ユーザーと大きく異なるローカルコンテキストで環境を再使用するための抽象ローカル変数への道を探しています
var test = [];
var main = function(event, userContext) {
test.push(1);
return event.get('time') + userContext.api_key;
}
:しかし、次のコードブロックのために、容器を再利用するために些細ではありませんJavaはJSコードをJavaバイトコードにコンパイルし、クラスとオブジェクトの関係と同じように、同じバイトコードを再利用して別のコンテキストで呼び出すようにします。
これを行う1つの方法は、各ユーザーに対してENGINE_SCOPE
を作成し、main関数を呼び出すときにバインディングを変更することです。しかし、私はクローンScriptObjectMirror
を見つける方法を見つけることができませんでした。ユーザーがプリコンパイルしたJSコードをアップロードして関数を呼び出すときに新しいスコープを作成することを計画しました。しかしNashornはエンジンスコープをプログラム的に作成することはできないようです。
別の問題は、JSがグローバルオブジェクトを変更できることです。ユーザーは何の問題もなく、次のコードブロックを実行することができますし、Object
は、すべての実行のためにnull
次のようになります。そのため
var test = [];
var main = function(event, userContext) {
Object = null;
return event.get('time') + userContext.api_key;
}
、私もGLOBAL_SCOPE
内の変数を変更する無効にする必要がありますが、私はそれを行うための方法を見つけることができませんでした。
コンテナを再利用するためのセキュリティ上の問題があり、ユーザーがアップロードしたJSコードごとに異なるコンテナを作成するのが安全だと認識しています。しかし、Nashorn環境を作成するのはV8に比べてかなり高価です。実行時にNashorn環境が多すぎると、JSコードブロックをJavaバイトコードにコンパイルしようとするため、JavaはCode Cache
を埋め込みます。私はこの問題を解決するための他の提案も開いています。
ScriptObjectMirrorは何も取得できません。しかし私はあなたのアプローチを試み、あなたに感謝を知らせます – Zo72
それは動作しません。私のコードが "新しいjava.util.HashMap()"であれば、それを作成することができます...私の目的を完全に破ります – Zo72