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.


SommaireMongoDB pour développeurs d'applicationsComment MongoDB gère-t-elle le SQL ou l'injection de requêtes ? (4)
précédent sommaire suivant
 

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);
Ici, my_query aura une valeur telle que {nom: "Joe"}. Si my_query contenait des caractères spéciaux, par exemple ,, :, et {, la requête ne trouverait tout simplement aucun document. Par exemple, les utilisateurs ne peuvent pas détourner une requête et la convertir en une suppression.

Mis à jour le 11 décembre 2016

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.
Toutes les opérations MongoDB suivantes vous permettent d'exécuter des expressions arbitraires de code JavaScript directement sur le serveur :


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.

Mis à jour le 11 décembre 2016

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 );
L'utilisateur pourrait avoir fourni une valeur $ dans une valeur a_key. En même temps, my_object pourrait être { $where : "things" }. Considérez les situations suivantes :

  • 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.

Mis à jour le 11 décembre 2016

Voir la page Notes de sécurité du pilote MongoDB PHP dans la documentation du pilote PHP pour plus d'informations.

Mis à jour le 11 décembre 2016

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2020 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.