我正在开发一个使用 MongoDB 作为后端的 RESTful API。以编程方式做的最简单的事情是简单地_id在 URI 中使用 MongoDB 的字段,例如:
https://api.example.com/collection/507c7f79bcf86cd7994f6c0e
我知道 ObjectID 部分基于创建时间戳。攻击者是否可以从 ObjectID 的知识中获得任何其他信息?
我正在开发一个使用 MongoDB 作为后端的 RESTful API。以编程方式做的最简单的事情是简单地_id在 URI 中使用 MongoDB 的字段,例如:
https://api.example.com/collection/507c7f79bcf86cd7994f6c0e
我知道 ObjectID 部分基于创建时间戳。攻击者是否可以从 ObjectID 的知识中获得任何其他信息?
根据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 以匹配其他人的。