FAQ MongoDBConsultez toutes les FAQ
Nombre d'auteurs : 1, nombre de questions : 331, dernière mise à jour : 18 décembre 2016 Ajouter une question
Cette FAQ a été réalisée à partir de la documentation officielle de Mongodb, des questions fréquemment posées sur les forums NoSQL Developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
Quand un programme client assemble une requête dans MongoDB, il construit un objet BSON, pas une chaîne. Ainsi les attaques traditionnelles d'injection de SQL ne sont pas un problème. Plus de détails et de nuances sont couverts ci-dessous.
MongoDB représente les requêtes comme des objets BSON. Typiquement, les bibliothèques clients fournissent un processus pratique, sans injection, pour construire ces objets. Prenons l'exemple suivant en C++ :
Code c++ : | Sélectionner tout |
1 2 | BSONObj my_query = BSON( "name" << a_name ); auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query); |
Vous pouvez désactiver toute exécution de code JavaScript de côté serveur, en passant l'option --noscripting en ligne de commande ou par l'activation de security.javascriptEnabled dans un fichier de configuration. |
Vous devez faire preuve de prudence dans ces cas pour empêcher les utilisateurs de soumettre du JavaScript malveillant.
Heureusement, vous pouvez exprimer la plupart des requêtes dans MongoDB sans JavaScript et pour les requêtes qui nécessitent JavaScript, vous pouvez mélanger JavaScript et non JavaScript en une seule requête. Placez tous les champs fournis par l'utilisateur directement dans un champ BSON et passez le code JavaScript au champ $where.
Si vous avez besoin de passer des valeurs fournies par l'utilisateur dans une clause $where, vous pouvez protéger ces valeurs avec le mécanisme CodeWScope. Lorsque vous définissez des valeurs soumises par l'utilisateur comme variables dans le document de portée, vous pouvez éviter de les évaluer sur le serveur de base de données.
Les noms de champs dans le langage de requête de MongoDB ont une signification sémantique. Le symbole du dollar, $, est un caractère réservé utilisé pour représenter des opérateurs (par exemple $inc). Ainsi, vous devez vous assurer que les utilisateurs de votre application ne peuvent pas injecter les opérateurs dans leurs entrées.
Dans certains cas, vous pouvez désirer construire un objet BSON avec une clé fournie par l'utilisateur. Dans ces situations, les clés devront remplacer les caractères réservés $ et .. Tout caractère est suffisant, mais pensez à utiliser leurs équivalents Unicode : U+FF04 (" $ ") et U+FF0E (" . ").
Prenons l'exemple suivant :
Code c++ : | Sélectionner tout |
BSONObj my_object = BSON( a_key << a_name );
- Insert. L'insertion de cela dans la base ne fait aucun mal. Le processus d'insertion n'évalue pas l'objet comme une requête.
Les pilotes client MongoDB, s'ils sont mis en \x{009c}uvre correctement, vérifient la présence des caractères réservés dans les clés lors des insertions. - Update. L'opération update() accepte l'opérateur $ comme argument, mais n'autorise pas l'opérateur $where. Pourtant, certains utilisateurs peuvent être en mesure d'injecter des opérateurs qui peuvent manipuler seulement un document unique. Par conséquent, votre demande doit échapper les clés, comme mentionné ci-dessus, s'il est possible qu'elles contiennent des caractères réservés ;
- Query. Généralement, ce n'est pas un problème pour les requêtes qui ressemblent à { x : user_obj } : les signes dollar ne sont pas de plus haut niveau et sont sans effet. En théorie, ce serait possible que les utilisateurs construisent eux-mêmes une requête. Mais la vérification de la présence des caractères $ dans les noms des clés du contenu soumis par ceux-ci peut aider à protéger contre ce type d'injection.
Voir la page Notes de sécurité du pilote MongoDB PHP dans la documentation du pilote PHP pour plus d'informations.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.