MongoDB $regex 查询和潜在的漏洞

2024-03-08

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

GET /api/items?q=foo

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

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

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

我可能没有足够的破坏性来想到这样的查询,所以我搜索了互联网并发现了这篇非常有趣的读物,其中提到了几种攻击:爆炸性量词陷阱 https://www.rexegg.com/regex-explosive-quantifiers.html.

抛开这个事实不谈,上页提到的查询的表现远非预期的“灾难性”(无论是在 MongoDB 查询中,还是在诸如正则表达式101.com https://regex101.com),我还想知道:

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

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

  1. 您可以定义查询可以运行的最长时间最大时间MS() https://docs.mongodb.com/manual/reference/method/cursor.maxTimeMS/#cursor.maxTimeMS.
  2. 您可以尝试清理正则表达式输入,但考虑到可能长时间运行的复杂查询的无穷变化,我怀疑是否有库可以帮助您。限制正则​​表达式的长度也可能有所帮助,但另一方面可能违背了允许用户使用任意过滤器方便地进行搜索的目的。
  3. 您可以提供更结构化的查询输入,例如只允许用户输入单个字母数字文本,然后将其包装在服务器端的正则表达式中以允许例如“开头为”、“包含”或“结尾为”查询或其他内容。
  4. 您可以允许每个用户(会话?ip?)进行一次并行查询,这可能对抵御致命的 DoS 攻击有一点帮助,但肯定对分布式攻击没有帮助……或者您甚至可以只允许跨网络对该端点进行一次并行调用整个系统。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB $regex 查询和潜在的漏洞 的相关文章

随机推荐