爆发的病理性正则表达(时间和记忆)?

时间:2011-03-15 03:15:36

标签: php python regex perl

什么是病态正则表达式会炸毁许多解析器(包括时间和内存)? 哪个解析器?奖励指出正则表达式越基本和标准,非恶意用户可能无辜地想出它。 随意发布实际时间和内存数据,以及解析器版本。

(我似乎记得在PERL中过度的后视断言或(EDIT :)回溯据说是这样做的,或者至少曾经是这样。还有其他吗?)

3 个答案:

答案 0 :(得分:3)

来自Russ Cox的优秀article$ perl -e '("a" x 100000) =~ /^(ab?)*$/;'。这显然导致了一个段错误。文章中还有更多内容。

答案 1 :(得分:3)

改编自文章Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)中的第一个示例:

perl -e '$n=29; ("a" x $n) =~ (("a?" x $n).("a" x $n))'

我的系统需要40多秒。然后$n++以指数方式增加乐趣......

答案 2 :(得分:0)

我总是使用这个正则表达式匹配PHP中的PHP或JavaScript源代码中的字符串:

~'(\\.|[^'])*'|"(\\.|[^"])*"~s

它几乎总是在很长的字符串上失败(大约50000个字符长度)。