49

ユーザーが任意の JavaScript コードを送信できるようにしたいと考えています。このコードは Node.JS サーバーに送信され、出力が複数のクライアントに (JSON として) 返される前に安全に実行されます。eval関数が思い浮かびますが、これには複数のセキュリティ上の懸念があることを知っています (ユーザーが送信したコードは、ノードのファイル API にアクセスできるなど) 。Microsoft Web Sandbox や Google Caja など、サニタイズされたマークアップとスクリプト (サードパーティの広告を Web サイトに埋め込むため) の実行を許可するプロジェクトを見てきましたが、これらはクライアント側のツールであるようで、できるかどうかはわかりません。ノード内で安全に使用できます。

Node で信頼されていない JavaScript をサンドボックス化して実行し、出力を取得する標準的な方法はありますか? これをサーバー側でやろうとするのは間違いですか?

編集:ユーザーが JavaScript のすべての機能を活用できることは重要ではありません。実際、ユーザー コードに提供される API を選択できることが望ましいでしょう。

編集:先に進み、見つけたもので更新します。この Sandcastle モジュール ( bcoe/sandcastle) は、私が考えていることを実行することを目的としているようです。どれだけ安全かはわかりませんが、私はこれはあまり重要なことではないので、試してみようと思います. これをうまく行うことができれば、私自身の答えを追加します。

4

5 に答える 5

12

vm.runInContext('js code', context), sample in api documentationを使用して、nodejsでサンドボックスサポートを使用できます:

https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options

const util = require('util');
const vm = require('vm');

const sandbox = { globalVar: 1 };
vm.createContext(sandbox);

for (var i = 0; i < 10; ++i) {
    vm.runInContext('globalVar *= 2;', sandbox);
}
console.log(util.inspect(sandbox));

// { globalVar: 1024 }

警告: 「s4y」で指摘されているように、欠陥があるようです。コメントを見てください。

于 2015-01-13T19:06:26.730 に答える
2

使用状況によっては、gVisor などの仮想環境でサンドボックスを保護することも検討することをお勧めします。ここでいくつかの情報を見つけることができます。

于 2019-10-07T22:39:50.703 に答える