私が書いているソフトウェアの機能として、JSで書かれた計算機を作成して、特定のデータセットに適用される料金を計算し、そのデータを参照することができます。私はMongoを使用しているので、これをサーバー側で安全に実行でき、ブラウザーはphpページを呼び出して応答を取得するだけです。関数は管理コントロールパネルから書き込まれ、データベースに保存されます。もちろん、その関数内からdbインタラクションを実行することはありませんが、mongocodeの実行はデータベース内で実行されるため、mongocodeは本来実行できます。db.foo
自分自身と電卓を書くことになるかもしれない他の人を守るために、私db = null;
は$context
new 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
、私はすべて準備ができています!