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

dag*_*da1 5 regex eslint

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

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

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

谁能告诉我为什么这是不安全的以及我可以采取什么措施来解决它?

它运行这个

Bla*_*mba 7

详细信息: 终于有时间了,我将解释这里发生的事情。原因是灾难性的回溯。我将从博客中获取示例:

你正在做这样的事情 (x+x+)+y 当这样做时([A-Za-z.,' -]*[A-Za-z.,'-])x+x+ 可能被限制为 x+ 但在你的情况下,两个 x 之间几乎没有区别。因此,您的解决方案是使用([A-Za-z.,' -]* ?)这种正则表达式引擎不会破坏系统。

博客中描述了发生的情况:

考虑正则表达式 (x+x+)+y。让我们看看将此正则表达式应用于 xxxxxxxxxxy 时会发生什么。第一个 x+ 将匹配所有 10 个 x 字符。第二个 x+ 失败。然后第一个 x+ 回溯到 9 个匹配项,第二个 x+ 则拾取剩余的 x。该组现已匹配一次。该组重复,但在第一个 x+ 处失败。当 y 失败时,正则表达式引擎回溯。该组有一个可以回溯到的迭代。第二个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 缺失的情况。对于 11x 的弦,需要 5118 步。对于 12,需要 10238 步。显然,这里的指数复杂度为 O(2^n)。在 21 倍时,调试器在执行 280 万步时退出,诊断出灾难性回溯的不良情况。

正则表达式引擎(如 .NET)将永远运行,而其他引擎将因堆栈溢出而崩溃(如 Perl,版本 5.10 之前)。堆栈溢出在 Windows 上尤其令人讨厌,因为它们往往会使您的应用程序消失而没有任何痕迹或解释。

这是关于这些插件的讨论

很棒的博客显示出了什么问题