2011-08-16 63 views
8

我正在試圖用mongoDB製作一個板子。使用Mongodb ObjectID作爲文檔ID?

我想分配文件ID與ObjectID。

如果用戶可以通過http://www.example.com/4easdf123123訪問文檔頁面,其中「4easdf123123」是mongoDB ObjectID。

是否有任何可能的安全威脅,如果我在URL中使用並顯示mongo ObjectID並將其用作文檔ID?

和任何建議與mongoDB分配文件ID?

+4

看不到任何問題。這與在URL中使用生成的RDBMS ID相同 – Phil

+0

您可以使用:https://github.com/treygriffith/short-mongo-id – user956584

回答

8

這看起來不像是一個MongoDB ObjectID - ObjectID是12個字節的二進制數據,當呈現爲十六進制字符串(在URL中使用它的常用方式)時,它的長度爲24個字符。我假設你使用的是official PHP Mongo Driver,在這種情況下,MongoId類的構造函數將忽略無效值併爲你生成一個新值。無論如何,最好讓驅動程序爲您生成一個ObjectID/MongoId,因爲它可以避免衝突。

至於在你的網址中使用它的安全性,你應該沒問題。當然,您應該使用通常的關於實現代碼的注意事項來確保當前用戶有權查看正在顯示的對象等,但在URL中使用ObjectID的安全風險不會高於任何其他數據庫標識符(字符串,整數等),並且通常較少,因爲ObjectID沒有語義值(而URL中的「adminuser」這樣的字符串可能表明該URL與具有提升特權的用戶相關)。

+0

好吧我將使用它:) – InspiredJW

+0

可以創建多少個唯一的MongoDB ObjectID ?龐大的數據可能會發生衝突嗎? – InspiredJW

+0

「ObjectId」被設計爲獨特的,即使在您的應用程序中沒有協調的情況下生成。它們包括時間戳,機器標識的散列值,進程或線程標識,以及一個3字節遞增計數器。您需要創建2^24或來自相同進程/線程的大約1600萬個ObjectId,以便發生衝突(或在計算機ID上運行散列衝突)。即使發生了這種情況,如果所討論的ObjectId與_id(或另一個唯一字段)在同一個集合中使用,也只是一個問題。 – dcrosta