我正在阅读有关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如何快速评估它吗?
答案 0 :(得分:2)
MongoDB使用Perl兼容的正则表达式(即“ PCRE”)版本8.41,支持UTF-8。
它也是stated here,用于处理用户提供的正则表达式
PCRE引擎允许您设置递归限制。限制越低,越能更好地防御ReDoS,但是中止合法正则表达式的风险也就越高,而合法正则表达式在稍多的时间就会找到有效的匹配项。低递归限制可能会阻止长正则表达式匹配。超时时间过短可能会过早终止对大文件的搜索。
PCRE根据Wikipedia
对迭代次数使用硬性限制PCRE对递归深度有严格限制,而Perl则没有
使用默认构建选项“ bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Perl使用堆进行递归,并且对递归深度没有硬性限制,而PCRE具有编译时硬性限制。
不幸的是,我无法获得Mongo对PCRE递归深度应用的实际硬限制。
有关PCRE递归深度的更多详细信息,请检查此answer