2012-11-18 7 views
9

Wie kann ich JavaScript NoSQL-Injektionen in MongoDB verhindern?JavaScript NoSQL Injektionsprävention in MongoDB

Ich arbeite an einer Node.js-Anwendung und ich übergebe req.body, die ein Json-Objekt ist, in die Speicherfunktion des Mungo-Modells. Ich dachte, hinter den Kulissen wären Sicherheitsvorkehrungen, aber das scheint nicht der Fall zu sein.

+3

Solange Sie den JSON mit 'JSON.parse' analysieren (im Gegensatz zu' eval'), und Sie die Daten validieren, sollten Sie in Ordnung sein. JSON ist nicht von Natur aus gefährlich :) – Ryan

+2

Verhindern Sie nicht, dass Dinge in Ihre Datenbank gelangen, und verhindern Sie, dass Dinge in Ihrer Datenbank als Code ausgeführt werden. – Incognito

+0

Wie parse ich mein Postobjekt? – daniel

Antwort

3

Hinweis Meine Antwort ist möglicherweise nicht mehr relevant. Bitte beziehen Sie sich auf andere Antworten.

-

Als Client-Programm fügt eine Abfrage in MongoDB, es baut ein BSON Objekt, keinen String. Daher sind herkömmliche SQL-Injection-Angriffe kein Problem.

Für Details folgen Sie der documentation

UPDATE

Ausdruck wie eval vermeiden, die beliebige JS ausführen kann. Wenn Sie Eingaben vom Benutzer nehmen und eval ähnliche Ausdrücke ausführen, ohne die Eingabe zu bereinigen, können Sie etwas vermasseln. Wie von JoBu1324 gezeigt, ermöglichen Operationen wie where, mapReduce und group, JS-Ausdrücke direkt auszuführen.

+3

Ich würde hinzufügen "Aber Vorsicht vor JavaScript-Injektion!" zur Antwort. Lesen Sie http://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf. – borisdiakur

+1

In Anbetracht der node.js-Tag und Javascript Unterabschnitt in der [docs] (http://docs.mongodb.org/manual/faq/developers/#how-does-mongodb-address-sql-or-query-injection), ist diese Antwort falsch? Ich suche gerade selbst nach der Antwort auf diese Frage. – JoBu1324

+0

@ JoBu1324 Ich habe die Antwort aktualisiert. Danke für das Verbessern der Antwort :) –

7

Obwohl die Post veraltet ist, antworte ich.

Ich kenne drei Möglichkeiten.

Erstens: Es ist ein multifunktionales content-filter. Bietet außerdem MongoDB-Injektionsschutz durch Filtern.

Zweitens:mongo-sanitize, Helfer zu mongodb Abfragen für Abfrage-Auswahl Injektionen zu sanieren.

Drittens: ich over here diese Lösung gesehen hatte, die auch für MongoDB angewendet werden kann. Es ist wirklich einfach zu implementieren. Verwenden Sie nur die integrierte escape()-Funktion von JavaScript.

escape() konvertiert die Zeichenfolge in ascii Code. $ne wird in %24ne umgewandelt.

var privateKey = escape(req.params.privateKey); 

App.findOne({ key: privateKey }, function (err, app) { 
    //do something here 
} 
12

Sushant ‚s Antwort ist nicht korrekt. Sie müssen NoSQL-Injektion in MongoDB beachten.

Beispiel (aus here)

User.findOne({ 
    "name" : req.params.name, 
    "password" : req.params.password 
}, callback); 

Wenn req.params.password ist { $ne: 1 }, wird der Benutzer ohne zu wissen, das Passwort abgerufen werden ($ne bedeutet nicht gleich 1).

MongoDB-Treiber

können Sie verwenden mongo-sanitize:

Es werden alle Tasten Streifen aus, die mit '$' in den Eingang zu starten, so dass Sie es MongoDB über passieren können, ohne sich Gedanken böswillige Benutzer überschreiben.

var sanitize = require('mongo-sanitize'); 

var name = sanitize(req.params.name); 
var password = sanitize(req.params.password); 

User.findOne({ 
    "name" : name, 
    "password" : password 
}, callback); 

Mongoose Treiber

Da es ein Schema folgt, wenn das Passwort ein String-Feld ist, wird es das Objekt { $ne: 1 } in String konvertiert und wird kein Schaden angerichtet werden. In diesem Fall müssen Sie nicht bereinigen, denken Sie daran, ein geeignetes Schema zu erstellen.

+0

ich habe es gerade mit 'req.params.password = '{$ ne: 1}' versucht und habe kein Ergebnis erhalten, bist du sicher, dass die Zeichenkette' req.params.password' hat jsons Inhalt geparst? –

+0

@MohammadAli nein, der JSON wird nicht automatisch geparst. Das Problem ist, wenn Sie ein Objekt '{$ ne: 1}' anstelle einer Zeichenkette '{$ ne: 1} '' erhalten. Ich habe darüber mit weiteren Details in meinem Blog geschrieben: [link] (https://zanon.io/posts/nosql-injection-in-mongodb). – Zanon

+0

soll das in der Antwort erwähnt werden? Was du über den Mungo-Treiber geschrieben hast, gilt auch für den einheimischen Mongodb-Treiber. und Sie vernachlässigen auch zu erwähnen, dass der Typ ein Objekt für das Beispiel –