我计划在我的服务中提供正则表达式支持,这样我的用户就可以配置正则表达式,如果字符串与正则表达式匹配,则会处理它。
然后我偶然发现了这些文章:
发现一个简单的正则表达式在我的服务器中可能是灾难性的。
我只需要基本的匹配能力。
我打算从正则表达式中删除括号,如果它是有效的正则表达式,它将被处理。我相信单独剥离括号将足以使我的服务器免受这些攻击。
我是对的,还是遗漏了什么?
答案 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?
没有括号。