Si on passe des paramètres $_GET (ou $_POST)
aux requêtes, il faut s'assurer de convertir en chaînes de caractères avant.
Les utilisateurs peuvent insérer des tableaux associatifs dans les requêtes
GET et POST, qui pourraient alors devenir des requêtes $ indésirables.
Un exemple assez anodin : supposez qu'on cherche les informations d'un
utilisateur avec la requête http://www.example.com?username=bob.
L'application crée la requête
$q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ]).
Cela fonctionne bien, mais quelqu'un pourrait subvertir cela en passant
http://www.example.com?username[$ne]=foo, que PHP
transformera magiquement en un tableau associatif, transformant le requête en
$q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] ),
qui renverra tous les utilisateurs dont le nom n'est pas "foo" (tous les utilisateurs, probablement).
C'est une attaque assez facile à contrer : il faut s'assurer que les paramètres
$_GET et $_POST sont du type attendu
avant d'envoyer à la base de données. PHP dispose de la fonction
filter_var() pour aider.
À noter que ce type d'attaque peut être utilisé avec n'importe quelle interaction avec la base de données qui localise un document, y compris les mises à jour, les upserts, les suppressions et les commandes findAndModify.
Voir » la documentation principale pour plus d'informations sur les problèmes de type injection SQL avec MongoDB.