我有一个看起来像这样的正则表达式/^[A-Za-z.,'-]([A-Za-z.,' -]*[A-Za-z.,'-])?$/
我最近添加了eslint-config-security插件,由于detect-unsafe-regex
规则,它已将上述正则表达式标记为不安全。
它没有说明为什么它不安全。
谁能告诉我为什么这是不安全的,我该怎么做才能解决?
它运行this软件包
答案 0 :(得分:2)
详细信息: 终于花了一些时间,所以我将解释这里发生的事情。原因是灾难性的回溯。 我将从博客中获取示例:
在执行此([A-Za-z.,' -]*[A-Za-z.,'-])
时,您正在执行类似(x + x +)+ y的操作,但是x + x +可能仅限于x +,但在您的情况下,两个x之间几乎没有区别。因此,为您提供的解决方案是使用([A-Za-z.,' -]* ?)
,这样正则表达式引擎不会破坏系统。
在from the blog下面说明了会发生什么:
考虑正则表达式(x + x +)+ y。让我们看看什么时候发生 您将此正则表达式应用于xxxxxxxxxxy。第一个x +将匹配所有10个x 字符。第二个x +失败。第一个x +然后回溯到9 匹配,第二个选择剩余的x。该小组有 现在匹配一次。该组重复但在第一个x +处失败。 失败,正则表达式引擎回溯。该小组可以进行一次迭代 回溯到。第二个x +仅匹配一个x,因此它不能 回溯。但是第一个x +可以放弃一个x。立即第二个x + 匹配xx。该组再次进行一次迭代,使下一次迭代失败,然后 y失败。当y失败时,正则表达式引擎回溯。该小组有 它可以回溯到一个迭代中。第二个x +仅匹配一个x, 因此它无法回溯。但是第一个x +可以放弃一个x。第二 x +立即匹配xx。该组再次进行一次迭代,失败了 下一个,则y失败。再次回溯,第二个x +现在有了 一个回溯位置,使其自身减少以匹配x。小组尝试 第二次迭代。第一个x +匹配,但第二个卡在 字符串的结尾。再次回溯,该小组的第一个x + 第一次迭代将其减少为7个字符。第二个x +匹配 xxx。失败y,第二个x +减少为xx,然后减少为x。
如果您在RegexBuddy的调试器中的10x字符串上尝试此正则表达式,它将 采取2558步骤找出最后的y缺失。对于11倍 字符串,它需要5118步。对于12,需要10238个步骤。显然我们 这里的指数复杂度为O(2 ^ n)。调试器的21倍 迈出280万步,诊断出严重的灾难性情况 回溯。
正则表达式引擎(例如.NET)将永远持续运行,而其他引擎将 因堆栈溢出而崩溃(如5.10之前的Perl)。堆 Windows上的溢出特别令人讨厌,因为它们往往会使 您的应用程序消失了,没有任何痕迹或解释。
答案 1 :(得分:2)
似乎插件使用单词 unsafe 来演示正则表达式,该正则表达式可能会导致catastrophic backtracking:
通过将恒星高度限制为1来检测潜在的灾难性指数时间正则表达式
,而您的正则表达式可能会导致它,您可以看到here in action。请read this answer对这个问题有更好的了解。