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 查询和潜在的漏洞 的相关文章

  • 显示来自 mongodb 的所有数据并在 doT.js 模板引擎中渲染它

    我想从 mongodb 中提取数据并将其传递给视图 一切似乎都正常 但我没有看到所有 10000 条记录都显示出来 而是只看到了一条 我觉得我非常接近解决它 但我陷入困境 我正在使用node mongodb native express和d
  • 优化正则表达式来解析中文拼音[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个有
  • 如何在 Java 中用 \n 替换 \\n

    我有一个string test first n middle n last 现在我想更换所有 n by n 我试过了test replaceAll n n and test replaceAll n n 但它们不起作用 有人有解决办法吗 T
  • mongodb - 检索数组子集

    看似简单的任务对我来说是一个挑战 我有以下 mongodb 结构 services TCP80 data status 1 delay 3 87 ts 1308056460 status 1 delay 2 83 ts 1308058080
  • 正则表达式或用单个空格替换多个空格的方法

    你能告诉我有没有办法在java或spring中用单个空格替换多个空格 有相同的 stringUtils 函数吗 like 1 test test test test 2 test test test test 3 test test tes
  • 如何返回n对括号的所有有效组合?

    def paren n lst for x in range n current string join lst solutions list for i in range len current string 1 close curren
  • 如何中止 MongoDB shell 中正在运行的查询?

    我不敢相信我必须问这个问题 但是如何停止我刚刚运行的查询 该查询现在正在运行 并且显然需要很长时间才能在 Mongo shell 中完成 Control C似乎会使外壳崩溃 并吐出大量错误 中建议的愚蠢解决方案这个帖子 https stac
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 正则表达式中间名首字母有或没有它

    我似乎无法正确验证用户 FirstName LastName 并检查 MiddleName 如下所示 John Doe Valid John M Doe Valid John Mr Doe Invalid John m Doe Invali
  • 正则表达式最小值4 个字符,最多 11 个,允许空格和特殊字符

    我在 RegularExpressionValidator NET 控件上有一个正则表达式 w 4 11 工作正常 它允许字符串长度在 4 到 11 之间 我希望它允许空格和特殊字符 例如 丹麦语字符 有什么建议么 怎么样 4 11 或者只
  • 我可以要求在 mongodb 集合中设置属性吗? (不为空)

    我可以在 mongodb 中定义一个需要设置某些属性的模式吗 很像NOT NULL在 SQL 中 如果可以的话 这个的语法是什么 我正在使用 Node js 和猫鼬 猫鼬 v3 6 15 MongoDB v2 4 5 EditCharles
  • i18Next - NodeJS - 如何在不重新加载服务器的情况下更改翻译

    我正在使用 NodeJS 的 i18next 包来启用翻译 我将它作为标准 并为每个语言 国家对使用一个 json 文件 我想构建一个管理页面来编辑翻译 而无需深入研究代码 那么 如何 重新加载 管理员编辑过的 json 文件 而无需重新启
  • 被一个简单的正则表达式难住了

    我想看看字符串是否s包含正则表达式中的任何符号 下面的正则表达式可以正常工作rubular http rubular com s asd d s 但在 Ruby 1 9 2 中 它给出了以下错误消息 syntax error unexpec
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 我如何在 mongodb 的数组中找到文本搜索

    id objectId 23651478 name Tomatos array title Vegetables description Vegitables are good to health id objectId 45761244
  • 猫鼬的深层填充

    我有两个模式 一张用于用户 另一张用于帖子 在用户模式中 我有latestPost的一个属性 它是帖子模式中条目的ObjectId 当我加载用户对象时 我想将 lastestPost 作为对象获取 其中包含用户架构中作者的用户名 其中作者是
  • 在 MongoDB 中,如何根据嵌入对象中的属性对文档进行排序?

    在我的产品集合中 我可以找到已在 GB 地区发布的所有产品 gt db products find release region GB pretty id foo release region GB date ISODate 2012 03
  • 匹配 JavaScript RegEx 中的不可见字符

    我有一些包含不可见字符的字符串 但它们位于可预测的位置 通常 围绕我想要提取的文本片段 然后在第二次出现之后我想保留文本的其余部分 我似乎不知道如何关闭隐形字符 and将它们从我的结果中排除 为了匹配隐形 我一直在使用这个正则表达式 xA0
  • 字边界正则表达式问题

    我在使用单词边界时遇到问题 b在我的正则表达式中 我正在使用 R 但当我尝试时问题也存在http regexr com http regexr com 我使用的模式是 bs l b 虽然我预计下面的第 1 行和第 3 行能够匹配此模式 但只
  • Mongoid 命名范围比较同一文档中的两个时间字段

    我需要在 Mongoid 中创建一个命名范围来比较同一文档中的两个时间字段 例如 scope foo where gt updated at gt gt checked at 这显然不会像它对待的那样起作用 checked at作为一个符号

随机推荐