这个正则表达式容易受到REDOS攻击吗

Bel*_*lun 4 regex regex-dos-attack

正则表达式:

^\d+(\.\d+)*$

我试图用打破它:

1234567890.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1。 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1。 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1。 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1。 1x]

那是200x“ .1”

我从阅读了有关ReDos攻击的信息:

但是,我对准备对表达式的ReDos攻击的技巧不太自信。由于“嵌套量词”,我试图触发灾难性的回溯。

那个表情容易碎吗?应该使用什么输入?如果是,您是如何提出的?

hob*_*bbs 6

“嵌套量词”本质上不是问题。这只是引用一个实际上更复杂的问题的简单方法。问题是“对子表达式进行量化,该子表达式本身可以以多种方式在同一位置进行匹配”。事实证明,您几乎总是需要在内部子表达式中提供一个量词以提供足够丰富的匹配项,因此,量词内部的量词会充当危险信号的红色标记,以指示发生问题的可能性

(.*)*这是有问题的,因为它.*具有最大的对称性-它可以在输入的任何点匹配零到所有其余字符之间的任何字符。重复此操作会导致组合爆炸。

([0-9a-f]+\d+)*这是有问题的,因为在数字串的任何点处,都有许多可能的方法可以在的初始子串[0-9a-f]+和最终的子串之间分配这些数字\d+,因此它具有与相同的确切问题(.*)*

(\.\d+)*不是问题,因为\.\d匹配完全不同的事情。一个数字不是一个点,一个点不是一个数字。在输入中的任何给定点上,只有一种可能的匹配方式\.,并且只有一种可能的匹配方式使\d+另一个重复的可能性成为可能(请消耗所有数字,因为如果我们停在一个数字之前,则下一个字符是当然不是一个点)。因此,即使在(\.\d+)*回溯\d*方面,即使包含嵌套的量词,它也不会比在相同上下文中的情况更糟。

  • 很好解释。从现在开始,当我检查自己的正则表达式时,我会想到“匹配相同模式的背对背量词”。+1 (2认同)