24

MongoDB への JavaScript NoSQL インジェクションを防ぐにはどうすればよいですか?

私はNode.jsアプリケーションに取り組んでおりreq.body、jsonオブジェクトである をmongooseモデルのsave関数に渡しています。舞台裏で安全装置があると思っていましたが、そうではないようです。

4

4 に答える 4

37

Sushantの答えは正しくありません。MongoDB での NoSQL インジェクションに注意する必要があります

ここから取得)

User.findOne({
    "name" : req.params.name, 
    "password" : req.params.password
}, callback); 

req.params.passwordisの場合{ $ne: 1 }、ユーザーはパスワードを知らなくても取得されます (等しくない$neことを意味します 1 )。

MongoDB ドライバー

mongo-sanitizeを使用できます:

入力内の「$」で始まるキーはすべて削除されるため、悪意のあるユーザーによる上書きを心配することなく MongoDB に渡すことができます。

var sanitize = require('mongo-sanitize');

var name = sanitize(req.params.name);
var password = sanitize(req.params.password);

User.findOne({
    "name" : name, 
    "password" : password
}, callback); 

マングースドライバー

スキーマに従っているため、パスワードが文字列フィールドの場合、オブジェクト{ $ne: 1 }が文字列に変換され、損傷は発生しません。この場合、サニタイズする必要はありません。適切なスキーマを設定することを忘れないでください。

于 2016-07-16T21:49:45.463 に答える
13

投稿は時代遅れですが、私は答えています。

私は3つの方法を知っています。

最初:多目的content-filterがあります。また、フィルター処理による MongoDB インジェクション保護も提供します。

2 番目: mongo-sanitize、クエリ セレクター インジェクションに対して mongodb クエリをサニタイズするヘルパー。

3 番目:ここで、MongoDB にも適用できるこのソリューションを見実装は本当に簡単です。escape()JavaScript の組み込み関数のみを使用し文字列をコード

escape()に変換しに変換されます。ascii$ne%24ne

var privateKey = escape(req.params.privateKey);

App.findOne({ key: privateKey }, function (err, app) {
  //do something here
}
于 2015-08-08T21:50:10.983 に答える
-2

注: 私の答えは正しくありません。他の回答を参照してください。

--

クライアント プログラムが MongoDB でクエリを組み立てると、文字列ではなく BSON オブジェクトが作成されます。したがって、従来の SQL インジェクション攻撃は問題になりません。

詳細については、ドキュメントに従ってください

アップデート

eval任意の JS を実行できるような表現は避けてください。ユーザーから入力を取得しeval、入力をクリーンアップせずに同様の式を実行すると、失敗する可能性があります。JoBu1324 で指摘されているようwhereに、 、 、などの操作は、 JS 式を直接実行することを許可しますmapReducegroup

于 2012-11-18T09:02:43.123 に答える