关于这个主题有很多问题,但我不确定我的正则表达式是否容易受到攻击。以下正则表达式是我用于电子邮件验证的正则表达式:
/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)
Run Code Online (Sandbox Code Playgroud)
因为我在一些地方使用了 *,所以我怀疑可能是这样。
我希望能够测试代码中出现的任意数量的问题。
我正在使用 Node.js,因此考虑到事件循环的单线程性质,这可能会完全关闭我的服务器。
好问题。是的,只要输入正确,它就很容易受到攻击,并且失控的正则表达式能够阻止整个节点进程,从而使服务不可用。
容易发生灾难性回溯的正则表达式的基本示例如下所示
^(\w+)*$
Run Code Online (Sandbox Code Playgroud)
在给定的正则表达式中可以多次找到的模式。
当正则表达式包含可选量词并且输入包含最终无法匹配的长序列时,JS 正则表达式引擎必须进行大量回溯并消耗 CPU。如果输入足够长,则可能无限。(您可以在regex101上使用此功能,也可以通过调整设置中的超时值来使用正则表达式。)
一般来说,
减轻 Node.js 中灾难性回溯的更激进的方法是将您的正则表达式工作包装在子进程或vm
上下文中,并设置有意义的超时。(在完美的世界中,JavaScript 的RegExp
构造函数可能会有一个超时参数,也许有一天。)