12

假设我的 Mongodb 中有一个 Products 数组。我希望用户能够在自己的页面上看到每个产品:http://www.mysite.com/product/12345/Widget-Wodget. 由于每个产品都没有增量整数 ID (12345),而是具有 BSON ID (5063a36bdeb13f7505000630),因此我需要添加整数 ID 或使用 BSON ID。

由于 BSON ID 包含 PID:

  • 4字节时间戳,
  • 3 字节机器标识符,
  • 2 字节进程 ID,
  • 3 字节计数器。

如果我在我的网址中使用 BSON ID,我是否会将安全信息暴露给外界?

4

3 回答 3

18

我想不出任何用于在您的机器上获得特权的用途,但是在任何地方使用 ObjectIds 仍然会泄露很多信息。

通过抓取您的网站,您可以:

  • 找到一些隐藏的对象:例如,如果计数器部分在时间 t1 和 t2 之间从 0x....b1 变为 0x....b9,则可以在这些倒数中猜测 ObjectIds。但是,如果您强制执行访问权限,猜测 id 很可能没有用
  • 知道每个用户的注册日期(不是非常敏感的信息,但总比没有好)
  • 从员工创建的对象的时间戳中推断出实际(而不是公开可用的)营业时间
  • 根据用户生成对象的时间戳推断您的受众生活在哪个时区:如果您的网站是人们在午餐时间最常使用的网站,那么可以测量 ObjectIds 的峰值并推断 UTC 晚上 8 点的峰值意味着受众在美国西海岸
  • 更一般地说,通过抓取您的大部分网站,您可以建立您的服务成功的时间表,在任何给定的时间内了解:您的用户数量,用户参与度,您拥有多少台服务器,多久一次您的服务器已重新启动。周末发生的 PID 更改更有可能发生崩溃,而工作日发生的那些更可能发生崩溃 + 软件修订
  • 并且可能会找到特定于您的业务流程和领域的其他信息

公平地说,即使使用随机 ID,也可以推断出很多东西。主要问题是您需要防止任何人抓取您网站的具有统计意义的部分。但如果有人下定决心,他们最终会成功,这就是为什么向他们提供所有这些额外的时间戳信息似乎是错误的。

于 2012-12-06T09:01:08.740 回答
2

共享ObjectID中的信息不会危及您的安全。有人可以推断出诸如 ObjectID 的创建时间(时间戳)之类的次要细节,但任何 ObjectID 组件都不应与身份验证或授权相关联。

如果您正在构建电子商务网站,SEO 通常是公共 URL 的重要考虑因素。在这种情况下,您通常希望使用比 ObjectID 更友好的 URL,其路径组件更短且语义更多。

请注意,您不必为您的_id字段使用默认的 ObjectID .. 因此可以始终生成与您的应用程序更相关的内容。默认的 ObjectID 确实提供了唯一性的合理保证,因此如果您实现自己的_id分配,则必须考虑到这一点。

也可以看看:

于 2012-12-05T21:03:45.573 回答
2

正如@Stennie 所说,并非如此。

让我们从 pid 开始,大多数黑客不会费心寻找 pid,比如说 Linux,他们会这样做:

ps aux | grep mongod

或类似的东西。当然,这需要黑客实际入侵了您的服务器,我知道仅基于 pid 没有可用的公共黑客攻击。考虑到 pid 会在您重新启动机器或 时发生变化mongod,因此这些信息对于任何试图进行间谍活动的人来说都是毫无用处的。

机器 ID 是另一种公开无用的数据,老实说,他们会更好地了解您的网络,ping或者digg比单独通过机器 ID 更好地了解您的网络。

所以回答这个问题:不,没有真正的安全威胁,而且你显示的信息对除了 MongoDB 之外的任何人都没有用。

我也同意@Stennie 关于使用 SEO 友好 URL 的观点,我常用于电子商务的一个示例是/product/product_title_使用较小的随机 id(可能是 base 64 编码_id)或最后使用自动递增的 id .html

于 2012-12-05T21:12:43.583 回答