2016-11-27 10 views
0

私はサンドボックス化された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を埋め込みます。私はこの問題を解決するための他の提案も開いています。

答えて

0

私はScriptContextオブジェクトが各実行を隔離すると信じています。

ScriptEngine engine = new ScriptEngineManager() 
     .getEngineByName("nashorn"); 

// Set up an isolated context. 
Bindings bindings = engine.createBindings(); 
ScriptContext isolatedContext = new SimpleScriptContext(); 
isolatedContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE); 

// Compile the function in the context. 
engine.eval(code, isolatedContext); 
ScriptObjectMirror fn = (ScriptObjectMirror) isolatedContext 
     .getAttribute("main"); 

// Call it whenever 
fn.call("main", arg1, ar2, argEtc); 
+0

ScriptObjectMirrorは何も取得できません。しかし私はあなたのアプローチを試み、あなたに感謝を知らせます – Zo72

+0

それは動作しません。私のコードが "新しいjava.util.HashMap()"であれば、それを作成することができます...私の目的を完全に破ります – Zo72

関連する問題