MongoDB ReDOS测试

时间:2018-10-26 12:35:54

标签: node.js regex mongodb denial-of-service

我正在阅读有关ReDOS的信息。 https://en.wikipedia.org/wiki/ReDoS

好像您在Node.js中运行以下代码:

console.time('aaa');
/^(a+)+$/.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!')
console.timeEnd('aaa');

运行大约需要7821毫秒。

但是,如果我向MongoDB添加相同的值:

db.users.insert({name: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!"});
db.users.findOne({name: { '$regex': '^(a+)+$'}});

这将立即进行评估,并返回null。

您知道MongoDB如何快速评估它吗?

1 个答案:

答案 0 :(得分:2)

根据MongoDB Docs

  

MongoDB使用Perl兼容的正则表达式(即“ PCRE”)版本8.41,支持UTF-8。

它也是stated here,用于处理用户提供的正则表达式

  

PCRE引擎允许您设置递归限制。限制越低,越能更好地防御ReDoS,但是中止合法正则表达式的风险也就越高,而合法正则表达式在稍多的时间就会找到有效的匹配项。低递归限制可能会阻止长正则表达式匹配。超时时间过短可能会过早终止对大文件的搜索。

PCRE根据Wikipedia

对迭代次数使用硬性限制
  

PCRE对递归深度有严格限制,而Perl则没有

     

使用默认构建选项“ bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Perl使用堆进行递归,并且对递归深度没有硬性限制,而PCRE具有编译时硬性限制。

不幸的是,我无法获得Mongo对PCRE递归深度应用的实际硬限制。

有关PCRE递归深度的更多详细信息,请检查此answer