Answers:
正则表达式的问题不在于正则表达式本身,而是具有各种“便捷”功能(例如回溯)的正则表达式引擎。因此,避免使用不具有这些功能的正则表达式引擎。
在将正则表达式编译为有限状态机之后,可以始终在线性时间内匹配计算机科学概念。因此,基于状态机的正则表达式引擎不能用于ReDoS。但是,在病理示例中,必要的状态机可能变得相当大。但是限制可用内存比限制可用计算时间要容易得多。
该RE2引擎是专门开发出对付不信任的正则表达式,并设计为线性时间执行。
另一种选择是使用简化的符号自己组装正则表达式。例如,您可能允许用户使用glob模式(如*.txt
)。然后,您可以通过防止回溯的方式来解析它,例如,禁止嵌套并且仅使用贪婪的量词。对于许多用例,简化的模式表示法就足够了。
在不使分析本身变慢的情况下,分析正则表达式以查看其是否变慢,就等于解决了停顿问题。换句话说,不可能找到正确而完整的解决方案。
当然,你可以的,找到一个解决方案是正确的,在完成了。例如,您可以使用安全使用的限制性白名单(例如,字符类为,重复编号为...)。这将允许您传递许多非关键的正则表达式,拒绝所有关键的正则表达式,并且(错误地)拒绝一些可以的,但过于复杂而无法自动证明安全的正则表达式。
作为lazarus项目的解析器的作者,我会说没有办法了解任何给定的正则表达式在给定的文本上将消耗哪些资源。
我不花费相同的资源(至少在big-O的意义上)。
因此,最好的方法-在单独的线程中运行解析器,并在超时后将其终止。
除了其他答案,解决方案还可能是滚动您自己的正则表达式库,该库允许在执行过程中进行性能检测,从而提供一种在满足某些条件时中途终止执行的方法。
同样,您可以在另一个线程上运行正则表达式,如果它们花费太长时间,则将其杀死。