如何降低 MongoDB ObjectID 的可猜测性?

How do I reduce guessability of MongoDB ObjectIDs?

MongoDB ObjectIDs are guessable.

我是 运行 一个具有公开可用资源的应用程序

http://application.com/resource/**ObjectID**

这些资源需要可公开访问(而不是登录后),但我正在努力减少黑客暴力破解 ObjectID 并随意抓取它们的可能性。

我的想法是在每个 MongoDB 文档中包含一个随机生成的密钥,以便在发出请求时可以匹配它。例如:

http://application.com/resource/**ObjectID**/**Key** http://application.com/resource/**ObjectID**?key=**Key**

甚至

http://**Key**.application.com/resource/**ObjectID**

如果密钥与文档中存储的密钥不匹配,则服务器将 return 404。

我意识到这不是保证隐私意义上的真正保护,因为如果中间有人嗅探 URL,他们就可以访问资源。我只是试图阻止某人暴力破解 ObjectID。

这种方法可行有效吗?

首先在这里很难看到你的目标。资源应该是可公开访问的,同时您担心有人可以猜出资源的位置。如果您在应用程序中包含猜测 ObjectID 会导致问题的原因,可能会更好。

我假设您正在尝试做一些允许交换数据的共享服务(例如通过文件共享的保管箱),并且您基本上是在尝试保护 ObjectID 背后的数据。

在这种情况下,您概述的方式没有问题,所以我将添加另一种方法:创建自己的objectID(一些随机生成的长字符串)。一个潜在的问题是它们可能会发生碰撞,但这种事件非常罕见,所以如果你将它包装成 try catch 并在失败时重做,你应该没问题。

在您引用的关于 ObjectID 生成的原始答案的上下文中,guessable 由 "given enough time" 限定。

我不会关注您的 ID 是否可以被暴力破解,而是研究检测和缓解任何暴力破解攻击的方法。这消除了给对手足够的时间来尝试所有可能组合的方面(一种无论您的 ID 格式如何都可以使用的方法)。

例如,检测暴力攻击的明显特征可能包括:

  • 来自特定 IP 地址的大量 404 请求
  • 连续请求增量 ObjectID(应该很少见)
  • 无效的 ObjectID(如果对手不知道预期的格式)

有许多不同的策略和对策需要考虑,但一个有用的起点是 OWASP 关于 Blocking Brute Force Attacks 的信息。

These resources need to be publicly accessible (not behind a login), however I'm trying to reduce the chance of a hacker brute-forcing ObjectIDs and scraping them at will.

如果资源是 public,对手可能有更简单的方法找到它们:抓取 public 页面并获取链接的资源。在这种情况下,您仍然可以应用反爬虫策略,但如果您想避免影响合法用户,这些策略会变得更加棘手。例如,来自特定 IP 的大量有效请求可能表示公司或 ISP 代理,而不是有人试图滥用您的服务。智能爬虫还可以模仿用户模式(请求之间的延迟、请求的 url 中的随机性,..)以试图破坏任何保护。

作为起点,请参阅:Anti-crawling Techniques