2013-04-10 62 views
16

我正在玩,直接從URL查詢字符串提供的mongo查詢有多危險?

爲了使事情正常運行,我將Express查詢字符串對象直接傳遞給mongoose find函數。我很好奇的是這種做法在現場應用程序中會有多危險。我知道RDBMS對於SQL注入極其脆弱。除了從「淨化你的投入」的好建議的邪惡是這樣的代碼:

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

意思就是AA GET請求http://localhost:8080/query?name=ahsteele&status=a只會推下到findDocs功能:

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

這種感覺很多原因引起的,但它有多不安全?將查詢參數傳遞給mongodb的最佳做法是什麼?快遞是否提供任何開箱衛生處理?

+0

有沒有聽說過操作員注射?因此,有人可以在可以從數據中收集數據的url中形成查詢,就像bobby表格示例一樣? – Sammaye 2013-04-10 07:21:00

+0

一旦你接受,仍需要進行消毒,我也想補充一點,你考慮的查詢可能會導致大量的系統不必要的顛簸,如果不使用索引,等等。 – WiredPrairie 2013-04-10 10:49:43

回答

18

至於注射是問題,就像SQL,風險是通過一個未知的攻擊向量顯著降低......儘管理論上是可能的。

數據結構和協議是二進制和API驅動的,而不是利用域特定語言中的轉義值。基本上,你不能欺騙解析器在最後添加一個「; db.dropCollection()」。

如果它僅用於查詢,它可能是罰款...但我還是提醒您要使用驗證的一點點:

  • 確保只有字母數字字符(過濾器或無效的空值和其他任何你通常不會接受)
  • 每學期
  • 強制執行最大長度(如255個字符)強制整個查詢的最大長度
  • 地帶特殊參數名稱以「$」,如「$哪裏」 &這樣
  • 不允許嵌套數組/文件/散列...只有串&整數

而且,要記住,一個空的查詢返回的一切。您可能需要對該返回值進行限制。:)

2

據我所知快車並沒有提供任何滅菌箱控制。要麼你可以編寫你自己的中間件,我們可以用你自己的邏輯做一些基本的檢查。正如你所說的,你提到的情況有點危險。

但是爲了方便使用,內置於Mongoose模型中的所需類型至少爲您提供了默認的清理以及對進入與否的控制。

E.g像這樣

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

});

請檢查此瞭解更多信息。

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