クエリに $_GET パラメータを渡している場合は、 まず最初にそれを文字列にキャストすることを忘れないようにしましょう。 GET リクエストには連想配列を入れることもでき、 そのまま使うと期待通りのクエリにはなりません。
当たり障りのない例を示します。ユーザの情報を調べるときに http://www.example.com?username=bob のようなリクエストを送っているとしましょう。アプリケーション側では $collection->find(array("username" => $_GET['username'])) のような問い合わせをします。
ここで、誰かが http://www.example.com?username[$ne]=foo のようなリクエストを送ったとします。PHP はこれを自動的に連想配列に変換するので、クエリは $collection->find(array("username" => array('$ne' => "foo"))) のようになります。これは、名前が "foo" ではないユーザすべて (おそらく全員でしょうね) の情報を返すことになります。
この攻撃を防ぐのはきわめて簡単です。$_GET パラメータが期待通りの型であることを確かめてから データベースにリクエストを送ればよいのです (この場合は、文字列にキャストすることになります)。
» Phil の指摘に感謝します。
» メインドキュメント には、MongoDB における SQL インジェクション風の問題に関する詳細な情報があります。