MongoDB ID是否可以猜测?

Eli*_*ias 19 security mongodb

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

谢谢!

Ada*_*ord 18

2019年1月更新:正如评论中所述,以下信息在版本3.2之前是正确的.版本3.4+ 更改了规范,以便将机器ID和进程ID合并为单个随机5字节值.这可能会使得更难找出文档的来源,但它也简化了生成并降低了冲突的可能性.

原答案:

对于塞尔吉奥的答案+1,在回答他们是否可以被猜到的时候,他们不是哈希,他们是可预测的,所以如果有足够的时间,他们可以被"暴力强迫".可能性取决于ObjectID的生成方式以及您如何进行猜测.首先,请阅读此处的规范:

对象ID规范

让我们一块一块地分解:

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

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

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

因此,有些事情可以让它们更难以单独猜测,但是如果没有大量的预见和保护措施,对于普通数据集,有效ObjectID的范围应该相当容易解决,因为它们都是前缀为时间戳(除非你以某种方式操纵它).

  • @Piotr-6.5年后事情发生了变化:)我在顶部添加了一个注释,其中包含基于您的注释的更新信息-谢谢。 (2认同)

Ser*_*sev 15

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

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

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

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

可选阅读:GUID上的Eric Lippert.