1

私が書いているソフトウェアの機能として、JSで書かれた計算機を作成して、特定のデータセットに適用される料金を計算し、そのデータを参照することができます。私はMongoを使用しているので、これをサーバー側で安全に実行でき、ブラウザーはphpページを呼び出して応答を取得するだけです。関数は管理コントロールパネルから書き込まれ、データベースに保存されます。もちろん、その関数内からdbインタラクションを実行することはありませんが、mongocodeの実行はデータベース内で実行されるため、mongocodeは本来実行できます。db.foo

自分自身と電卓を書くことになるかもしれない他の人を守るために、私db = null;$contextnew MongoCode()

これは少しこのように見えます:

$sample = [
    'estimatedvalue' => 200,
    'estimatedcost' => 400,
    'contractor'    => false,
    'db'    => null,
];
$fees = [
    '_id'   => new MongoId(),
    'name'  => 'Friendly name!',
    'code'  => new MongoCode('function(){return (contractor ? estimatedCost : estimatedValue)*0.01; /* If a contractor is doing the work, base fee on cost. */}', $sample),
];

$a = $this->siteDB->execute($fees['code']);

if(isset($a['errno'])){
    echo $a['errmsg'];
}else{
    var_dump($a['retval']);
}

幸い、それは機能します。それをすべてのコンテキストに注入すると、db.実行可能なコマンドはありません。NoSQLインジェクションが発生する可能性のあるポイントを作成したくありません!

これが防ぐものの例は次のとおりです。

 'code' => new MongoCode('function(){db.foo.remove();}', $sample),
 // Since db is now null, the above won't work

私の懸念:このMongoCode Execute環境に存在し、ユーザーが編集可能な関数に残すのに潜在的に有害である可能性のある他の変数はありますか?mongocode関数を介して他にアクセスできるものに関するドキュメントが見つかりませんでした。もしそうならdb、私はすべて準備ができています!

4

1 に答える 1

1

これは安全ではなく、ユーザーが編集できるJS関数を使用することはできないと思います。たとえば、これは変数を必要とせず、サーバーをシャットダウンします。

> db.eval("(new Mongo('localhost:27017')).getDB('admin').shutdownServer()")

彼らはデータを挿入したり、データベースを削除したり、システム内の他のサーバーに接続したり、一般的に大混乱を引き起こしたりする可能性があります。

JavaScriptでユーザーが編集可能な計算関数を許可しようとしている場合は、別のJSエンジンを使用し、MongoDBから値を取得して、値+ユーザー定義関数を完全に別のJSエンジンに渡します。

于 2012-12-07T16:21:10.573 に答える