2012-07-20 64 views
16

如果将api调用绑定到对象的id,是否可以简单地强制这个api来获取所有对象?如果你想到MySQL,这将是完全可能的增量整数ID。但是MongoDB呢? ids是可以猜测的吗?例如,如果你知道一个id,猜测其他(next,previous)id是否容易?MongoDB ID可以猜测吗?

谢谢!

回答

12

+1对于塞尔吉奥的回答,在回答他们是否可以猜到的时候,他们不是散列,他们是可以预测的,所以他们可以在给予足够时间的情况下“被迫”。可能性取决于如何生成ObjectID以及如何猜测。为了解释,第一,在这里阅读规格:

http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

那么让我们一块把它分解一块:

  • 标记 - 完全可以预测,只要你有当一个总体思路数据生成
  • 机 - 这是几个选项之一,其中一些更容易比别人决定的MD5哈希值,但高度依赖于环境
  • PID - 再次,没有VA的数量庞大梅毒这里,并且可以sleuthed用于从已知源产生的数据
  • 增量 - 如果这是一个随机数,而不是增量(两者都是允许的),则它是难以预料

要展开位在来源。的ObjectID可以由产生:

  • 的MongoDB本身(但可以迁移,移动,更新)
  • 司机
  • 您的应用程序(你可以手动插入(即插入或更新数据的任何机器上)你自己的对象ID,如果你愿意的话)

因此,有事情可以做,以使它们更难个别猜测,但没有大量的深谋远虑和保障,对于一个正常的数据集,有效的ObjectID的范围应该是相当容易解决,因为它们都带有时间戳前缀(除非你以某种方式操纵它)。

11

Mongo的ObjectId从来都不是为了防止暴力攻击(或任何攻击)。他们只是提供全球独一无二的。你应该而不是假设某个对象不能被用户访问,因为这个用户不应该知道它的ID。

为了实际保护您的资源,请使用其他技术。

如果您防御未经授权的访问,请在您的应用中放置一些授权逻辑(允许访问合法用户,否认其他人)。

如果您想阻止倾倒所有对象,请使用某种速率限制。如果适用,与授权结合使用。

可选阅读:Eric Lippert on GUIDs