MongoDB ID是否可以猜测?

时间:2012-07-20 10:22:51

标签: security mongodb

如果将api调用绑定到对象的id,是否可以简单地强制使用此api来获取所有对象?如果你想到MySQL,这对于增量整数id来说是完全可能的。但MongoDB怎么样? ids可以猜到吗?例如,如果您知道一个ID,是否可以轻松猜出其他(下一个,上一个)ID?

谢谢!

2 个答案:

答案 0 :(得分:17)

2019年1月更新:如评论中所述,以下信息在version 3.2之前为止。版本3.4+ changed the spec,以便将机器ID和进程ID合并为单个随机5字节值。这可能会使得难以弄清楚文档的来源,但它也简化了生成并降低了碰撞的可能性。

原始答案:

对于Sergio的回答来说,+1是回答他们是否可以猜到,他们不是哈希,他们是可预测的,所以如果有足够的时间,他们可以被“暴力强迫”。可能性取决于ObjectID的生成方式以及您如何进行猜测。首先,请阅读此处的规范:

Object ID Spec

让我们一点一点地分解:

  • TimeStamp - 只要您大致了解数据的生成时间,就可以完全预测
  • 机器 - 这是几个选项之一的MD5哈希值,其中一些比其他选项更容易确定,但高度依赖于环境
  • PID - 再次,这里没有大量的值,并且可以为从已知来源生成的数据进行调整
  • 增量 - 如果这是一个随机数而不是一个增量(两者都是允许的),那么它就不太可预测了

扩大一些来源。 ObjectID可以通过以下方式生成:

  • MongoDB本身(但可以迁移,移动,更新)
  • 驱动程序(在任何插入或更新数据的计算机上)
  • 您的应用程序(如果您愿意,可以手动插入自己的ObjectID)

所以,有些事情你可以做些让他们更难以单独猜测,但没有很多的预见和保障,对于普通的数据集,有效的ObjectID的范围应该相当容易解决,因为它们都是以时间戳为前缀(除非你以某种方式操纵它)。

答案 1 :(得分:14)

Mongo的ObjectId从来就不是为了防止暴力攻击(或任何攻击,就此而言)。它们只是提供全球唯一性。您应该假设某个对象无法被用户访问,因为该用户不应该知道其ID。

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

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

如果要阻止转储所有对象,请使用某种速率限制。如果适用,请结合授权。

可选阅读:Eric Lippert on GUIDs