2

nodejsモジュールからグローバルコンテキストを削除する方法について何か考えはありますか?

以下の問題の解決策を探しているわけではありませんが、さらにコンテキストが必要な場合は、ここにアクセスしてください。

私は、ユーザーが独自の nodejs モジュールをアップロードできるプロジェクトに取り組んでおり、事前定義されたフレームワークに適合する場合、1 日を通して定期的に実行されます。明らかに、これは主要なセキュリティ上の懸念事項です。良い 90% の解決策は、単純にグローバル コンテキストを削除することです。

4

1 に答える 1

5

コメントに記載されているように、無限ループによりノードプロセスがフリーズするため、ユーザー提供のモジュールを別のプロセスで実行する必要があります。

VMモジュールから開始する必要があります。

  • ファイルの内容を読み取ります (ではなくfs.readFilerequireを使用)。
  • 新しいグローバル オブジェクトを定義します。必要なものをすべて公開する (残りは非表示にする) ことができます。
  • ユーザー コードを実行します。

次に例を示します。

var fs = require('fs'),
    vm = require('vm');

関数 runCode(ファイル名) {
  var コード = fs.readFileSync(ファイル名)、
      サンドボックス = {
        コンソール: コンソール、
        setTimeout: setTimeout,
        clearTimeout: clearTimeout,
        必要: 必要,
        モジュール: モジュール、
        輸出: 輸出,
        プロセス: プロセス、
        バッファ: バッファ
      };

  vm.runInNewContext(コード、サンドボックス、ファイル名);
}

ユーザー提供のコードは、グローバル スコープにあるかのように、サンドボックスで渡したすべてのものにアクセスできます。私の場合、実際の node.js グローバル スコープからほとんどすべてを公開することにしました。公開しないものを選択できます。

また、ソリューションを安全にしたい場合は、child_process.spawnを確認する必要があります。

于 2012-12-22T00:25:32.503 に答える