首页 > 解决方案 > 这个正则表达式有什么“不安全”的?

问题描述

我试图在我的 JS 代码中使用以下正则表达式来查找~...~块:

/(?<!~)~([^~\n]+)~(?!~)/g

但是随后 ESLint(v7.22.0配置为使用 eslint-plugin-security: v1.4.0,解析器设置为ES10,在 node.js 上运行:)v14.15.5给了我以下警告:

Unsafe Regular Expression  security/detect-unsafe-regex

因此,我将正则表达式更改为:

/([^~]|^)~([^~\n]+)~(?!~)/g

它不再给我任何警告。我还在ReDoS Checker上测试了我的两个正则表达式,结果相似。但是我无法得到第一个正则表达式可能不安全的地方,而后者在后一个正则表达式的情况下并不安全。

这发生在另外两个使用后向功能的正则表达式中。在使用后向断言时我应该记住什么?

标签: node.jsregexeslint

解决方案


不要对这些自动检查过于信任。他们可能会检测到常见的错误模式,但并非每个警告都一定意味着正则表达式可能会遇到灾难性的回溯,我会说正则表达式太复杂,无法从自动化工具中获得明确的答案.

您显示的两个表达式是等效的,第二个恰好没有绊倒电线。我不认为这两者都不安全。


推荐阅读