Regex 在正则表达式中不单独使用括号会阻止重做吗?

Regex 在正则表达式中不单独使用括号会阻止重做吗?,regex,security,match,code-injection,denial-of-service,Regex,Security,Match,Code Injection,Denial Of Service,我计划在我的服务中提供正则表达式支持,这样我的用户就可以配置正则表达式,如果字符串与正则表达式匹配,就会处理它 然后我偶然发现了这些文章: 发现一个简单的正则表达式在我的服务器上可能会造成灾难 我只需要基本的匹配能力 我打算从正则表达式中去掉括号,如果它是一个有效的正则表达式,它将被处理。我相信仅仅去掉括号就足以使我的服务器免遭这些攻击 我说的对吗?还是遗漏了什么?是的,这是一种幼稚的方法,会使您的服务器容易受到DOS攻击 事实上,你给自己的第一个链接非常好,你可以看看: 然而,检测这样邪恶

我计划在我的服务中提供正则表达式支持,这样我的用户就可以配置正则表达式,如果字符串与正则表达式匹配,就会处理它

然后我偶然发现了这些文章:

发现一个简单的正则表达式在我的服务器上可能会造成灾难

我只需要基本的匹配能力

我打算从正则表达式中去掉括号,如果它是一个有效的正则表达式,它将被处理。我相信仅仅去掉括号就足以使我的服务器免遭这些攻击


我说的对吗?还是遗漏了什么?

是的,这是一种幼稚的方法,会使您的服务器容易受到DOS攻击

事实上,你给自己的第一个链接非常好,你可以看看:


然而,检测这样邪恶的正则表达式似乎是一项困难的任务。这取决于你想冒多大的风险?一种解决方案可能是构建一种机制来生成进程/线程(取决于您的平台),该机制使用给定的正则表达式计算输入字符串并为其设置超时。一旦这个过程花费很长时间(只要你能负担得起),你就可以杀死它。

是的,这是一种幼稚的方法,会使你的服务器容易受到DOS攻击

事实上,你给自己的第一个链接非常好,你可以看看:


然而,检测这样邪恶的正则表达式似乎是一项困难的任务。这取决于你想冒多大的风险?一种解决方案可能是构建一种机制来生成进程/线程(取决于您的平台),该机制使用给定的正则表达式计算输入字符串并为其设置超时。一旦这个过程花费很长时间(只要你能负担得起),你就可以终止它。

你运行的风险很大程度上取决于你的特定regexp库。经典的“逃跑”RE(本质上)是
aa?
重复N次,与N
a
的字符串匹配。在PHP、Python和Perl的默认库中,它的运行时间大约是指数级的,而对于Common Lisp的CL-PCRE(Perl兼容)和Go的regexp包(POSIX正则表达式),它的运行时间大致是线性的


请注意,
aa?aa?aa?
没有括号。

您面临的风险高度依赖于您特定的regexp库。经典的“逃跑”RE(本质上)是
aa?
重复N次,与N
a
的字符串匹配。在PHP、Python和Perl的默认库中,它的运行时间大约是指数级的,而对于Common Lisp的CL-PCRE(Perl兼容)和Go的regexp包(POSIX正则表达式),它的运行时间大致是线性的


请注意,
aa?aa?aa?
没有括号。

什么,连看都不看就把所有括号都扯下来?如果实际需要paren,并且您删除了它们,那么结果可能在语法上是有效的,但它将是一个不同的正则表达式。对于用反斜杠转义的paren,或者在字符类中转义的paren,或者两者都转义的paren,您会怎么做?您是否使用支持非捕获组、原子组、lookaheads、lookbehinds、分支重置组、条件的regex风格…?我正在尝试提供模式匹配支持。我以为我可以简单地使用正则表达式,但发现了邪恶的正则表达式。我只是想知道,不单独支持分组是否能防止任何邪恶。但是从公认的答案中学到这是不够的。什么,连看都不看就把括号都扯了?如果实际需要paren,并且您删除了它们,那么结果可能在语法上是有效的,但它将是一个不同的正则表达式。对于用反斜杠转义的paren,或者在字符类中转义的paren,或者两者都转义的paren,您会怎么做?您是否使用支持非捕获组、原子组、lookaheads、lookbehinds、分支重置组、条件的regex风格…?我正在尝试提供模式匹配支持。我以为我可以简单地使用正则表达式,但发现了邪恶的正则表达式。我只是想知道,不单独支持分组是否能防止任何邪恶。但从公认的答案中学到这是不够的。这回答了我的问题。也参考了这个问题,发现
a{01000}a{01000}
a*b*[ac]*$
也是邪恶的正则表达式,即使它们没有括号。这回答了我的问题。还提到了这个问题,并发现
a{01000}a{01000}
a*b*[ac]*$
也是邪恶的正则表达式,即使它们没有括号。