2

JavaScript(node.js)で書かれたアプリケーションサーバーがあります。Webブラウザからの入力としてJS機能コードを受け入れます。今、私は他に何も影響を与えずにサーバー上でこの関数を実行できるようにしたいと思っています。

この関数が変更するすべての変数が関数に対してローカルであり、サーバー上の他の変数に影響を与えないことを確認したいと思います。

また、無限ループや再帰、その他の予期しない問題をなんとかして避けたいと思います。

ほとんどの場合、アクションを実行する前に、実行する関数としてユーザーがコードをトリガーできるようにしたいと思います。

何か案は ?

4

2 に答える 2

4

サンドボックスは、READMEによるとノードモジュールです。

  • 信頼できないコードの実行に使用できます
  • タイムアウトのサポート(たとえば、無限ループの防止)
  • 制限されたコード(node.jsメソッドにアクセスできません)

@maericsが書いた停止問題は、コードのタイムアウトを設定することで解決できますが、同じプロセスでそれを行うことはできません。たとえば、コードwhile(1)がブロックされるためです。サンドボックスは、子プロセスを使用してこの問題に対処します。

したがって、サンドボックスはメインプロセスではなく子プロセスにあるため、変数の問題も解決する必要があります。

前述のように、セキュリティ上の大きなリスクが伴うため、可能であれば、ユーザーがサーバー上で任意のコードを実行することは避けてください。モジュールがこの制限を提供している場合でも、少なくとも子プロセスをできるだけ非特権ユーザーで実行する必要があります。

于 2013-03-02T17:02:05.260 に答える
2

任意のコードが無期限に実行されるか終了するかをプログラムで判断することはできません。

これは停止性問題と呼ばれます。

別のプロセスでサンドボックス化することにより、任意のJSコードが作成した変数以外の変数を変更するのを防ぐことができる場合があります。

いずれにせよ、サーバー上で実行するために任意のコードを受け入れることは、システムに大きなセキュリティリスクをもたらします。どうすればそれを回避できるかを慎重に考えてください。

于 2013-02-15T16:23:13.750 に答える