0

node.js を学ぶために、ユーザーがオンライン ゲーム マフィアをプレイできる Web サイトを作成しています。マフィアになじみのない人のために説明すると、これはフォーラムで最も一般的にプレイされるゲームであり、無知な多数派 (「タウン」) と有能な少数派 (「マフィア」) を対戦させます。ただし、これは正確で簡単な概要ですが、実際には、すべてのゲーム セッションで、ゲームの仕組みを劇的に変える可能性のあるさまざまなハウス ルールが見られる可能性があります。

私のウェブサイトがこれらすべてのバリエーションを処理できるようにしたいと考えています。最初は、すべてのマフィアの亜種を実行できる包括的なフレームワークを自分の Web サイトに実装することを計画していました。しかし、いくつかの異なるフォーラムにアーカイブされた完成したゲームの大量のルール セットを調べた後、合理的なルールとゲームプレイの仕組みのスペースが非常に大きいため、すべてを許可する新しいドメイン固有のプログラミング言語を作成する必要があることに気付きました。可能なバリアント。それ以外の場合は簡単な個人プロジェクトのために新しい言語を発明するのはかなりばかげており、現時点では興味がありません。特に、手元に完全に優れた言語、つまり JavaScript があることを考えると。

したがって、亜種の作成者が、適切な時点で私の Web サイトが呼び出す亜種コードを含む JavaScript ファイルをアップロードできるようにすることにしました。基本的に、マフィア バリアント ゲーム ロジックを実装する JavaScript モジュール (これは、私の Web サイトのコードで必要です()) は、私の Web サイトの「ゲーム エンジン」に対するスクリプト言語として機能します。C++ ゲームの Lua を考えてみてください。残念ながら、これは深刻なセキュリティ上の問題を引き起こします。ブラウザとは異なり、ノード実行 JavaScript はファイル システムやネットワークなどにアクセスできます。したがって、悪意のあるユーザーがハード ドライブの内容を削除したり、Bitcoin マイニングを開始したりするバリアント ファイルをアップロードするのは簡単です。 、または何でも。

私が最初に考えたのは、各ユーザーがアップロードした 'fs' や 'http' などの危険なライブラリのコードを無効な文字列に replace() し、ファイルをロードしようとしたときに結果として生じる例外をキャッチすることでした。ただし、このアドホックなブラックリスト手法は、私より頭が良く、知識が豊富な多くの人々の 1 人がハートビートで克服できるようなアプローチのように感じます。私が本当に必要としているのは、ユーザーがアップロードしたコードがアクセスできるライブラリをホワイトリストに登録する方法です。Node.jsでJavaScriptを使用してこれを行う方法はありますか? そうでない場合、ノードサーバーが実行されるコンピューターを可能な限り保護する方法をお勧めしますか?

私の現在の戦略は、システムに取り込まれる前に、私自身と少数の信頼できるユーザーにレビューを依頼し、ユーザーがアップロードした JavaScript バリアント コードを全会一致で支持することです。それ。

4

1 に答える 1

2

これにはvmモジュールを使用する必要があります。基本的に、カスタマイズされたコンテキストでスクリプトを実行できるため、必要なグローバルを配置したり、独自のrequireなどを定義したりできます.

また、node.js では、ライブラリがないとアプリに損害を与える可能性があることも覚えておく必要があります。ユーザーはwhile (true) {}、プロセス全体を停止するようなものを追加するだけで済みます。そのため、信頼できないコードはすべて別のプロセスで実行し、CPU やメモリを乱用し始めたときにそれらを強制終了できるようにしておく必要があります。

于 2013-11-04T05:33:25.590 に答える