2016-03-04 24 views
0

我计划在我的服务中提供正则表达式支持,这样我的用户就可以配置一个正则表达式,并且如果字符串与正则表达式匹配,字符串将被处理。正则表达式中没有单独的括号会阻止ReDOS?

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

OWASP ReDOS

blog.makensi.es

,发现有个简单的正则表达式可以在我的服务器灾难性的。

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

我打算从正则表达式中去除括号,如果它是一个有效的正则表达式,它将被处理。我相信单独剥离括号就足以将我的服务器从这些攻击中拯救出来。

我是对的还是错过了什么?

+0

什么,只是放大所有的括号甚至没有看?如果实际需要的是parens,并且您将其删除,则结果可能在语法上有效,但它将是一个不同的正则表达式。你会怎样处理那些用反斜杠或角色班或两者都逃跑的人?您是否使用支持非捕获组,原子组,lookaheads,lookbeheads,分支重置组,条件的正则表达式...? –

+0

我正在尝试提供模式匹配支持。我以为我可以简单地使用正则表达式,但发现了邪恶的正则表达式。我只是想知道,如果不支持单独组合,将会防止任何邪恶。但从已被接受的答案中得知,这还不够。 – Vigneshwaran

回答

1

是的,这将是一个天真的做法,并会让您的服务器易受DOS攻击。

你给自己其实第一个环节是相当不错的和免费到它,你可以看看:How can I recognize an evil regex?

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

1

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

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

+0

这回答我的问题。 也提到这个问题http://stackoverflow.com/questions/12841970/how-can-i-recognize-an-evil-regex?lq=1并发现'a {0,1000} a {0,1000 }'和'a * b * [ac] * $'也是邪恶的正则表达式,即使它们没有括号。 – Vigneshwaran