MongoDBでのインジェクションには、いくつかの懸念事項があります。
$where
JSインジェクション-ユーザー入力からJavaScript関数を作成すると、予想とは異なる動作をするクエリが生成される可能性があります。一般に、JavaScript関数はMongoDBクエリをプログラムするための責任のある方法ではないため、絶対に必要な場合を除いて、JavaScript関数を使用しないことを強くお勧めします。
- オペレーターインジェクション-ユーザーが(正面から)
$or
何かを構築できるようにすると、クエリを変更するためにこの機能を簡単に操作できるようになります。もちろん、これは、一連のテキストフィールドからデータを取得し、そのデータから手動で作成する場合には適用されません$or
。
- JSONインジェクション-最近、かなりの数の人々が、クライアント側のソースから送信された完全なJSONドキュメント(皮肉なことに、これを最初にJAVAで見た)をMongoDBに挿入するためのドキュメントに変換しようとしています。なぜこれが悪いのかを説明する必要はありません。もちろん、MongoDBはBSONであるため、フィールドのJSON値は問題ありません。
@Burhanが述べたように、注入はサニタイズされていない入力から発生します。幸い、MongoDBには、オブジェクト指向のクエリがあります。
SQLインジェクションの問題は、「SQL」という言葉に起因しています。SQLは、文字列で構成されたクエリ言語です。一方、MongoDBは実際にはBSONドキュメントを使用してクエリ(オブジェクト)を指定します。上記で示した基本的な常識的なルールを守れば、次のような攻撃ベクトルで問題が発生することはありません。
SELECT * FROM tbl_user WHERE ='';DROP TABLE;
また、MongoDBはコマンドatmごとに1つの操作のみをサポートしているため(使用eval
せずに、これは絶対に行わないでください)、とにかく機能しません...
これは、データ検証のみのインジェクションには適用されないことを付け加えておきます。