在正则表达式中没有单独的括号会阻止ReDOS吗?

时间:2016-03-04 14:14:14

标签: regex security match code-injection denial-of-service

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

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

OWASP ReDOS

blog.makensi.es

发现一个简单的正则表达式在我的服务器中可能是灾难性的。

我只需要基本的匹配能力。

我打算从正则表达式中删除括号,如果它是有效的正则表达式,它将被处理。我相信单独剥离括号将足以使我的服务器免受这些攻击。

我是对的,还是遗漏了什么?

2 个答案:

答案 0 :(得分:1)

是的,这将是一种天真的方法,会使您的服务器容易受到DOS攻击。

实际上,你给自己的第一个链接非常好,你可以看看它是免费的:How can I recognize an evil regex?

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

答案 1 :(得分:1)

您运行的风险高度依赖于您的特定正则表达式库。经典的“失控”RE(重要地)aa?重复N次,与N a的字符串匹配。这在PHP,Python和Perl的默认库中以大约指数的时间运行,并且对于Common Lisp的CL-PCRE(perl兼容)和Go的regexp包(POSIX正则表达式)大致是线性的。

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