- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在阅读有关 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 如何能够如此快速地评估它吗?
最佳答案
根据 MongoDB Docs
MongoDB uses Perl compatible regular expressions (i.e. “PCRE” ) version 8.41 with UTF-8 support.
也是stated here用于处理用户提供的正则表达式
The PCRE engine allows you to set recursion limits. The lower your limits the better the protection against ReDoS, but higher the risk of aborting legitimate regexes that would find a valid match given slightly more time. Low recursion limits may prevent long regex matches. Low timeouts may abort searches through large files too early.
PCRE 根据 Wikipedia 对迭代次数使用硬性限制
PCRE has a hard limit on recursion depth, Perl does not
With default build options "bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/ will fail to match due to stack overflow, but Perl will match this correctly. Perl uses the heap for recursion and has no hard limit for recursion depth, whereas PCRE has a compile time hard limit.
不幸的是,我无法了解 Mongo 对 PCRE 递归深度应用的实际硬限制。
有关 PCRE 递归深度的更多详细信息,请查看此 answer
关于node.js - MongoDB ReDOS 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53008875/
我有一个带有 4 个编辑框和一个备忘录的表单,我正在尝试弄清楚如何实现多个撤消重做,例如 - 因此,如果用户在编辑 3,1,2、备忘录中输入文本,然后编辑 4,我想按反转顺序撤消,并按原始顺序重做。
我正在开发一个具有富文本编辑器功能的应用程序。在 ZSSRichTextEditor 之上我已经编写了我的编辑器代码。这里我的编辑器是 UIWebView,它将被 javascript 代码注入(in
我在 JavaScript 中使用正则表达式验证日期,但是当我运行 SonarQube 进行代码分析时。它将正则表达式显示为安全漏洞。 示例 1: 下面是正则表达式模式(链接到正则表达式的来源 htt
正则表达式: ^\d+(\.\d+)*$ 我试图打破它: 1234567890.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.
我最近遇到了一些重做攻击问题。 简单步骤讲解 :Regex denial of services :这意味着攻击者可以放置一些恶意/精心设计的输入来使您的服务器无法停止找到正确的模式,从而占用您的整个
当我在上面明确声明时,我在 main.cpp 上遇到 redo char(粗体)错误。我还想知道为什么它要求我在 using namespace std 前面放一个分号,因为我以前从未这样做过。 //
我试图重新创建 regular expression denial of service attack using (a+)+ regexp and aaaaaaaaaaaaaaaaaaaaaaaaa
Undo/Redo 的最佳数据结构是什么,(ctrl+z , ctrl+y) ?前几天我们老师说栈最适合undo,但是我在想双链表 .. 有没有其他数据结构能以更好的质量达到我们的目的?或这两者之一引
pycharm中出现一条消息 缺少键盘映射 找不到键盘映射“Windows 正确重做” 我不知道这个消息是什么意思以及如何解决它。请帮忙 最佳答案 您应该打开 Windows Proper Redo.
在我的理解中,mysql binlog 完全可以作为 InnoDB 的重做日志。 那么,启用binlog后,为什么InnoDB还要同时写redo log而不是直接切换使用binlog呢?这不会显着降低
这是 W3C HTML spec 建议用于电子邮件验证的正则表达式模式: ^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0
我创建了一个自定义 QPushButton,允许从菜单或 QColorDialog 中选择颜色。由于它是“主题”编辑器的一部分,我还添加了对 QUndoStack 的支持:每次更改自定义按钮的颜色时,
我有一个文件夹 (MY_FILES),其中包含大约 500 个文件,并且每天都会收到一个新文件并将其放置在那里。每个文件的大小约为 4Mb。 我刚刚开发了一个简单的“void main”来测试我是否可
我正在阅读有关 ReDOS 的内容。 https://en.wikipedia.org/wiki/ReDoS 如果您在 Node.js 中运行此代码,似乎: console.time('aaa');
我正在学习 Python,我遇到了一种情况,我想使用迭代器中的项目。棘手的部分是在某些条件下,我想“取消迭代”。也就是说,在我循环之前将一个项目放回迭代器的前面。 例如,假设我正在从树上摘苹果。我的果
前言 最开始了解mysql实现的时候,总听到redo log, wal(write-ahead logging),undo log这些关键词,了解到redo log主要是用于实现事务的持久化的。为
我需要实现 undo和 redo我的应用程序中的功能。我发现最简单的方法(?)是使用 openlayers undo和 redo内置功能。 -> http://dev.openlayers.org/d
我想向我的 Mac 应用程序添加撤消/重做功能。该应用程序可与笔记一起使用,我想在用户删除笔记时添加“撤消”操作。 这工作得很好,“撤消删除注释”菜单在用户删除注释后变为事件状态,但是在使用“撤消删除
我也在 Qt 论坛中发布了这个问题,here 我正在尝试在我的应用程序中执行撤消和重做命令。我有一个 QTreeWidget,我想让用户撤消和重做一个操作(例如,更改 QTreeWidget 中 QT
我试图在我的 mfc 应用程序中创建重做/撤消功能,但是当我试图撤消 CLine 对象时 - 它无法正常工作。我做错了什么?对不起我的英语! void CKonokhovDoc::OnEditUndo
我是一名优秀的程序员,十分优秀!