【问题标题】:Using Mongodb ObjectID as a document ID?使用 Mongodb ObjectID 作为文档 ID?
【发布时间】:2011-08-16 01:32:27
【问题描述】:

我正在尝试用 mongoDB 制作一个板。

我想用 ObjectID 分配文档 ID。

如果用户可以通过http://www.example.com/4easdf123123 访问文档页面,其中“4easdf123123”是 mongoDB ObjectID。

如果我在 URL 中使用并显示 mongo ObjectID 并将其用作文档 ID,是否存在任何可能的安全威胁?

对于使用 mongoDB 分配文档 ID 有什么建议吗?

【问题讨论】:

标签: php mongodb mongodb-php


【解决方案1】:

这看起来不像 MongoDB ObjectID —— ObjectID 是 12 字节的二进制数据,当呈现为十六进制字符串(在 URL 中使用它的常用方法)时,它将是 24 个字符长。我假设您使用的是official PHP Mongo Driver,在这种情况下MongoId 类的构造函数将忽略无效值并为您生成一个新值。无论如何,最好让驱动程序为您生成一个 ObjectID/MongoId,因为它会以一种避免冲突的方式生成。

至于在您的网址中使用它的安全性,您应该没问题。当然,您应该使用有关实现代码的常规预防措施来确保当前用户有权查看正在显示的对象等,但是在 URL 中使用 ObjectID 不会比任何其他数据库标识符(字符串、整数等),并且通常更少,因为 ObjectID 没有语义值(而 URL 中的“adminuser”之类的字符串可能表明该 URL 与具有提升权限的用户相关)。

【讨论】:

  • 可以创建多少个唯一的 MongoDB ObjectID?在海量数据中是否可能发生冲突?
  • ObjectIds 被设计成独一无二的,即使在没有跨应用程序协调的情况下生成也是如此。它们包括时间戳、机器 ID 的散列、进程或线程 ID,以及 3 字节递增计数器。您需要从同一个进程/线程创建 2^24 或大约 1600 万个 ObjectIds 才能发生冲突(或在机器 ID 上遇到哈希冲突)。即使发生这种情况,也只有当相关的 ObjectIds 与 _id (或其他唯一字段)在同一个集合中使用时才会成为问题。
  • 我决定使用“用户名 + unix 时间戳”作为包含用户创建的消息。我觉得这很合理。
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
相关资源
最近更新 更多