2013-04-10 14 views
16

Sto giocando con , e .Quanto è pericolosa una query mongo che viene alimentata direttamente da una stringa di query URL?

Al fine di ottenere qualcosa in esecuzione in questo momento sto passando l'oggetto stringa query Express direttamente a una funzione di ricerca mangusta. Quello di cui sono curioso è quanto pericolosa sarebbe questa pratica in un'app live. So che un RDBMS sarebbe estremamente vulnerabile all'iniezione SQL. A parte il buon consiglio di "disinfettare le immissioni" come il male è questo codice:

app.get('/query', function (req, res) { 
    models.findDocs(req.query, function (err, docs) { 
      res.send(docs); 
     }); 
}); 

Il che significa che aa richiesta GET a http://localhost:8080/query?name=ahsteele&status=a sarebbe solo spingere il seguente nella funzione findDocs:

{ 
    name: 'ahsteele', 
    status: 'a' 
} 

Questo si sente icky per molte ragioni, ma quanto è pericoloso? Qual è la procedura migliore per passare i parametri di query a mongodb? Esprime qualsiasi sanitizzazione immediata?

+0

Hai mai sentito parlare di iniezione da parte dell'operatore? In che modo qualcuno potrebbe formulare una query all'interno dell'URL che potrebbe raccogliere dati dai dati molto simili all'esempio dei tavoli da bobby? – Sammaye

+0

Una volta accettata la sanitizzazione che deve ancora essere eseguita, aggiungerei anche che si consideri che le query potrebbero causare un eccessivo uso eccessivo dei sistemi se gli indici non vengono utilizzati, ecc. – WiredPrairie

risposta

18

Per quanto riguarda l'iniezione essendo problema, come con SQL, il rischio è significativamente più basso ... anche se teoricamente possibile tramite un vettore di attacco sconosciuto.

Le strutture dati e il protocollo sono binari e basati su API anziché sfruttare i valori di escape all'interno di un linguaggio specifico del dominio. Fondamentalmente, non puoi semplicemente ingannare il parser aggiungendo un "; db.dropCollection()" alla fine.

Se è utilizzato solo per le query, è probabilmente bene ... ma mi piacerebbe cautela ancora di utilizzare un po 'di convalida:

  • Garantire solo caratteri alfanumerici (filtro o invalidare i valori nulli e quant'altro normalmente non si accetta)
  • imporre una lunghezza massima (come 255 caratteri) per termine
  • Imporre una lunghezza massima di l'intera query
  • Striscia speciali nomi dei parametri inizia con "$", come "$ dove" & quali
  • Non consentire nidificate array/documenti/hash ... solo stringhe & interi

Inoltre, tenere a mente, una query vuota ritorna tutto. Potresti volere un limite su quel valore di ritorno.:)

2

Per quanto ne so, Express non fornisce alcun controllo fuori dalla scatola per la sanificazione. O puoi scrivere il tuo middleware, fare alcuni controlli di base nella tua logica. E come hai detto, il caso che hai menzionato è un po 'rischioso.

Ma per facilità di utilizzo, i tipi richiesti integrati nei modelli Mongoose forniscono almeno le disinfettanti predefinite e un certo controllo su ciò che entra o meno.

per esempio qualcosa di simile

var Person = new Schema({ 
    title : { type: String, required: true } 
, age  : { type: Number, min: 5, max: 20 } 
, meta : { 
     likes : [String] 
    , birth : { type: Date, default: Date.now } 
    } 

});

Controllare questo per ulteriori informazioni anche.

http://mongoosejs.com/docs/2.7.x/docs/model-definition.html

Problemi correlati