MongoDB への JavaScript NoSQL インジェクションを防ぐにはどうすればよいですか?
私はNode.jsアプリケーションに取り組んでおりreq.body
、jsonオブジェクトである をmongooseモデルのsave関数に渡しています。舞台裏で安全装置があると思っていましたが、そうではないようです。
MongoDB への JavaScript NoSQL インジェクションを防ぐにはどうすればよいですか?
私はNode.jsアプリケーションに取り組んでおりreq.body
、jsonオブジェクトである をmongooseモデルのsave関数に渡しています。舞台裏で安全装置があると思っていましたが、そうではないようです。
Sushantの答えは正しくありません。MongoDB での NoSQL インジェクションに注意する必要があります
例(ここから取得)
User.findOne({
"name" : req.params.name,
"password" : req.params.password
}, callback);
req.params.password
isの場合{ $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 }
が文字列に変換され、損傷は発生しません。この場合、サニタイズする必要はありません。適切なスキーマを設定することを忘れないでください。
投稿は時代遅れですが、私は答えています。
私は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
}
注: 私の答えは正しくありません。他の回答を参照してください。
--
クライアント プログラムが MongoDB でクエリを組み立てると、文字列ではなく BSON オブジェクトが作成されます。したがって、従来の SQL インジェクション攻撃は問題になりません。
詳細については、ドキュメントに従ってください
アップデート
eval
任意の JS を実行できるような表現は避けてください。ユーザーから入力を取得しeval
、入力をクリーンアップせずに同様の式を実行すると、失敗する可能性があります。JoBu1324 で指摘されているようwhere
に、 、 、などの操作は、 JS 式を直接実行することを許可しますmapReduce
。group