2013-04-10 15 views
16

Gram w pobliżu z , i .Jak niebezpieczne jest zapytanie mongo, które jest pobierane bezpośrednio z ciągu zapytania adresu URL?

W trosce o to, aby coś w tej chwili działało, przechodzę przez obiekt ciągu zapytań ekspresowych bezpośrednio do funkcji wyszukiwania mongoose. Ciekawi mnie, jak niebezpieczna byłaby ta praktyka w aplikacji na żywo. Wiem, że RDBMS byłby bardzo podatny na iniekcję SQL. Oprócz dobrych rad „zdezynfekować swoje wejścia” jak zły jest ten kod:

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

znaczy, że aa get żądanie http://localhost:8080/query?name=ahsteele&status=a po prostu wpakować następujące do funkcji findDocs:

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

to czuje icky z wielu powodów, ale jak niebezpieczne jest to? Jaka jest najlepsza praktyka przekazywania parametrów zapytania do mongodb? Czy ekspres zapewnia jakiekolwiek odkażanie z pudełka?

+0

Czy słyszałeś o zastrzyku operatora? W jaki sposób ktoś mógłby utworzyć zapytanie w obrębie adresu URL, które mogłoby zbierać dane z danych, podobnie jak w przypadku tabel bobby? – Sammaye

+0

Po zaakceptowaniu wymaganej odkażania, należy również dodać, że zapytania mogą powodować niepotrzebne niszczenie systemów, jeśli indeksy nie są używane itp. – WiredPrairie

Odpowiedz

18

miarę wtrysku będącego problem, jak z SQL, ryzyko jest znacznie niższe ... chociaż teoretycznie możliwe poprzez nieznanego atakiem.

Struktury danych i protokół są sterowane binarnie i przez API, a nie wykorzystują wartości zacieniowane w obrębie określonego języka. Zasadniczo nie można po prostu oszukać parsera, dodając na końcu "; db.dropCollection()".

Jeśli jest używany tylko dla zapytań, to chyba dobrze ... ale to wciąż ostrzegają, aby użyć odrobinę walidacji:

  • Upewnij się tylko znaki alfanumeryczne (filtr lub utratę wartości null i nic innego normalnie nie akceptuje)
  • Wymuszanie długość max (jak 255 znaków) za semestr
  • Wymuszanie max długość całego zapytania
  • Gazy specjalne nazwy parametrów zaczynające się od „$”, podobnie jak „$ gdzie" & takie
  • Nie dopuszczać zagnieżdżonych tablic/Dokumenty/mieszań ... Tylko strun & ints

Ponadto, należy pamiętać, pusty zapytanie zwraca wszystko. Możesz chcieć ograniczyć tę wartość zwracaną.:)

2

O ile wiem, Express nie zapewnia żadnej kontroli nad pudełkiem w celu odkażenia. Możesz napisać własne oprogramowanie pośrednie, wykonując kilka prostych kontroli we własnej logice. A jak powiedziałeś, sprawa, o której wspomniałeś, jest nieco ryzykowna.

Jednak dla ułatwienia użytkowania wymagane typy wbudowane w modele Mongoose dają co najmniej domyślne sanitizacje i pewną kontrolę nad tym, co dostaje się lub nie.

Np coś takiego

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 } 
    } 

});

Sprawdź to również po więcej informacji.

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

Powiązane problemy