MongoDB$regex查询和潜在的漏洞



我们有一个REST API,用于在MongoDB中查询记录。非常简单,大致如下:

GET /api/items?q=foo

在开发过程中,允许正则表达式作为查询q很方便。我们只需将查询参数传递给 MongoDB$regex运算符,而不执行任何转义:

db.getCollection('items').find({ name: { $regex: req.query.q, $options: 'i' } });

因此,我们有一种非常灵活和方便的方式来查询我们的数据。现在,事情变得越来越"严重",即接近生产,我问自己安全隐患。有人可以发送带有昂贵回溯的"DoS"查询吗?

我可能没有足够的破坏性来考虑这样的查询,所以我在互联网上搜索并看到了这本非常有趣的读物,其中提到了几种攻击:爆炸量词陷阱。

抛弃这样一个事实,即上面页面上提到的查询的行为远非预期的"灾难性"(无论是在 MongoDB 查询中,还是在 regex101.com 等在线工具中(,我仍然想知道:

  1. 这是一个真正的问题,还是我在追逐不存在的威胁?
  2. 我们应该更好地完全摆脱正则表达式参数吗?
  3. MongoDB是否有任何机制(即超时(来防止通过恶意正则表达式进行DoS攻击?(fwiw:我们在 Node.js 环境中运行(
  4. 在发出查询之前,是否有任何库可以检测此类攻击?

我个人的直觉说:不要打扰。但话又说回来,如果您仍然这样做,甚至必须这样做,那么这里有一些关于如何处理此要求的建议:

  1. 您可以使用 maxTimeMS(( 定义查询可以运行的最长时间。
  2. 您可以尝试清理正则表达式输入,但我怀疑是否有库可以帮助您,因为潜在长时间运行的复杂查询的无穷无尽的变化。限制正则表达式的长度也可能有所帮助,但另一方面,可能会破坏允许用户方便地使用任意过滤器进行搜索的目的。
  3. 您可以配置更结构化的查询输入,例如只
  4. 允许用户输入单个字母数字文本,然后将其包装在服务器端的正则表达式中,以允许例如"开头为"、"包含"或"结尾为"查询或其他内容。
  5. 您可以只允许每个用户进行一个并行查询(会话?ip?(,这可能会对致命的DoS攻击有所帮助,但肯定不会对分布式攻击有所帮助。或者,您甚至可以在整个系统中只允许对该端点进行一次并行调用。

最新更新