4

この質問をしようとしたときに、Java を使用しているこの質問を取得ました。回答では、Ruby の例が示されました。Json を使用している場合にのみインジェクションが発生するようです。私はNoSQLとSQLを比較しようとする場所を公開しているので、私は言っていました:幸せになってください、nosqlにはSQLではないのでSQLインジェクションがありません...

説明してもらえますか:

  • Python ドライバー (pymongo) を使用しているときに SQL インジェクションがどのように発生するか。
  • それを避ける方法。
  • ログインフォームのコメントを使用して、古い方法のSQLインジェクションを使用した比較。
4

2 に答える 2

9

MongoDBでのインジェクションには、いくつかの懸念事項があります。

  • $whereJSインジェクション-ユーザー入力から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せずに、これは絶対に行わないでください)、とにかく機能しません...

これは、データ検証のみのインジェクションには適用されないことを付け加えておきます。

于 2012-10-27T13:54:40.793 に答える
3

SQL インジェクションはデータベースとは何の関係もありません。これは、標的のシステムが SQL サーバーに与えられた SQL をサニタイズしないため、任意の SQL コマンドの実行を可能にする一種の脆弱性です。

NoSQL を使用しているかどうかは関係ありません。mongodb(またはcouchdb、またはXYZ db)で実行されているシステムがあり、ユーザーがレコードを入力できるフロントエンドを提供している場合、フロントエンドからの入力を正しくエスケープおよびサニタイズしません。あなたはSQLインジェクションに対してオープンです。

于 2012-10-27T10:30:05.487 に答える