有没有办法测试我的正则表达式是否容易受到灾难性回溯的影响?

Gar*_*ary 6 regex

关于这个主题有很多问题,但我不确定我的正则表达式是否容易受到攻击。以下正则表达式是我用于电子邮件验证的正则表达式:

/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)
Run Code Online (Sandbox Code Playgroud)

因为我在一些地方使用了 *,所以我怀疑可能是这样。

我希望能够测试代码中出现的任意数量的问题。

我正在使用 Node.js,因此考虑到事件循环的单线程性质,这可能会完全关闭我的服务器。

wp7*_*8de 9

好问题。是的,只要输入正确,它就很容易受到攻击,并且失控的正则表达式能够阻止整个节点进程,从而使服务不可用。

容易发生灾难性回溯的正则表达式的基本示例如下所示

^(\w+)*$
Run Code Online (Sandbox Code Playgroud)

在给定的正则表达式中可以多次找到的模式。
当正则表达式包含可选量词并且输入包含最终无法匹配的长序列时,JS 正则表达式引擎必须进行大量回溯并消耗 CPU。如果输入足够长,则可能无限。(您可以在regex101上使用此功能,也可以通过调整设置中的超时值来使用正则表达式。)

一般来说,

  • 避免怪物
  • 尽可能使用 HTML5 输入验证(在前端),
  • 使用已建立的验证库进行公共输入,例如validator.js
  • 尝试使用safe-regexvuln-regex- detector等工具提前检测潜在的灾难性指数时间正则表达式(这些工具几乎提供了您想要的东西),
  • 并了解你的东西1 , 2 , 3(我认为第三个链接最好地解释了这个问题)。

减轻 Node.js 中灾难性回溯的更激进的方法是将您的正则表达式工作包装在子进程或vm上下文中,并设置有意义的超时。(在完美的世界中,JavaScript 的RegExp构造函数可能会有一个超时参数,也许有一天。)

  1. 这里描述了使用子进程的方法。

  2. 此处描述了 VM 上下文(沙箱)方法。

  • @Bergi 你现在快乐吗? (2认同)