向用户公开 MongoDB ObjectID 是否安全(例如在 URI 中)?

信息安全 mongodb
2021-09-09 19:26:39

我正在开发一个使用 MongoDB 作为后端的 RESTful API。以编程方式做的最简单的事情是简单地_id在 URI 中使用 MongoDB 的字段,例如:

https://api.example.com/collection/507c7f79bcf86cd7994f6c0e

我知道 ObjectID 部分基于创建时间戳。攻击者是否可以从 ObjectID 的知识中获得任何其他信息?

2个回答

根据Mongo 的文档,以下内容用于构造 ObjectId:

ObjectId is a 12-byte BSON type, constructed using:

  a 4-byte value representing the seconds since the Unix epoch,
  a 3-byte machine identifier,
  a 2-byte process id, and
  a 3-byte counter, starting with a random value.

所以回答你的问题,

攻击者是否可以从 ObjectID 的知识中获得任何其他信息?

我想说,除了时间戳之外,它们似乎还可以确定机器标识符、进程 ID 和您的计数器值。

确保您保护自己免受直接对象引用攻击(无论如何您都应该这样做)。

MongoDB OID 是可预测的。因此,如果您需要强制执行访问限制,例如不允许第 1 组中的 A 访问属于第 2 组中的人员的类似分类对象,那么您需要确保您的应用程序对所有点强制执行这些规则使用权。

例如,一个灾难性的策略是将用户的 OID 存储在浏览器中,可能在 authZ 之后获取和存储,并将其用于 authN,因为更改您在服务器中的身份所需的一切都是旋转浏览器存储的 OID 以匹配其他人的。