如果将api调用绑定到对象的id,是否可以简单地强制使用此api来获取所有对象?如果你想到MySQL,这对于增量整数id来说是完全可能的。但MongoDB怎么样? ids可以猜到吗?例如,如果您知道一个ID,是否可以轻松猜出其他(下一个,上一个)ID?
谢谢!
答案 0 :(得分:17)
2019年1月更新:如评论中所述,以下信息在version 3.2之前为止。版本3.4+ changed the spec,以便将机器ID和进程ID合并为单个随机5字节值。这可能会使得难以弄清楚文档的来源,但它也简化了生成并降低了碰撞的可能性。
原始答案:
对于Sergio的回答来说,+1是回答他们是否可以猜到,他们不是哈希,他们是可预测的,所以如果有足够的时间,他们可以被“暴力强迫”。可能性取决于ObjectID的生成方式以及您如何进行猜测。首先,请阅读此处的规范:让我们一点一点地分解:
扩大一些来源。 ObjectID可以通过以下方式生成:
所以,有些事情你可以做些让他们更难以单独猜测,但没有很多的预见和保障,对于普通的数据集,有效的ObjectID的范围应该相当容易解决,因为它们都是以时间戳为前缀(除非你以某种方式操纵它)。
答案 1 :(得分:14)
Mongo的ObjectId从来就不是为了防止暴力攻击(或任何攻击,就此而言)。它们只是提供全球唯一性。您应该不假设某个对象无法被用户访问,因为该用户不应该知道其ID。
为了实际保护您的资源,请采用其他技术。
如果您防止未经授权的访问,请在您的应用中放置一些授权逻辑(允许访问合法用户,拒绝其他人)。
如果要阻止转储所有对象,请使用某种速率限制。如果适用,请结合授权。
可选阅读:Eric Lippert on GUIDs。