Verifica che l'input sia una stringa: è sicuro?

1

Stavo cercando di scoprire come prevenire le iniezioni di MongoDB e mi sono imbattuto in questo . Quindi, il codice vulnerabile qui è

app.post('/', function (req, res) {
        db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { // This line!
            // TODO: handle the rest
        });
});

Posso proteggere da un'iniezione di MongoDB verificando che il nome utente e la password del POST siano entrambe stringhe e non oggetti?

Esistono altri modi per iniettare dati in un database MongoDB?

    
posta Bennett 20.07.2017 - 22:18
fonte

1 risposta

1

Sì, verificando che l'input sia una stringa lo sanitizzerà.

MongoDB non analizza le stringhe, solo JSON. Un attacco comune su MongoDB è:

{"$gte":""}

Quando inserisci una query, questo restituirà tutti gli oggetti. Un utente malintenzionato può passarlo come parametro e alcuni parser lo espandono automaticamente in un oggetto, il che renderà il tuo JSON simile a questo

{
    username: "root",
    password: { $gte: ""}
}

Quando viene eseguito questo comando find, restituirà l'utente root anche se non è stata fornita una password. (Nota: non verificare password come questa)

Ora ecco un esempio in cui ci assicuriamo che l'input sia una stringa

{
    username: "root",
    password: "{\"$gte\":\"\"}"
}

Come puoi vedere, non c'è iniezione e stiamo letteralmente cercando quella password.

    
risposta data 21.07.2017 - 00:03
fonte

Leggi altre domande sui tag