es-lint-security标记不安全的正则表达式

时间:2018-08-06 15:09:19

标签: regex eslint

我有一个看起来像这样的正则表达式/^[A-Za-z.,'-]([A-Za-z.,' -]*[A-Za-z.,'-])?$/

我最近添加了eslint-config-security插件,由于detect-unsafe-regex规则,它已将上述正则表达式标记为不安全。

它没有说明为什么它不安全。

谁能告诉我为什么这是不安全的,我该怎么做才能解决?

它运行this软件包

2 个答案:

答案 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上的溢出特别令人讨厌,因为它们往往会使   您的应用程序消失了,没有任何痕迹或解释。

Here's the discussion about these plugins

And great blog showing what's wrong

答案 1 :(得分:2)

似乎插件使用单词 unsafe 来演示正则表达式,该正则表达式可能会导致catastrophic backtracking

  

通过将恒星高度限制为1来检测潜在的灾难性指数时间正则表达式

,而您的正则表达式可能会导致它,您可以看到here in action。请read this answer对这个问题有更好的了解。