我在 JavaScript 中使用正则表达式验证日期,但是当我运行 SonarQube 进行代码分析时。它将正则表达式显示为安全漏洞。
示例 1:
下面是正则表达式模式(链接到正则表达式的来源 https://stackoverflow.com/a/15504877/13353721 ):
^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
示例 2:
对于 float 值,我使用了以下正则表达式
^\d{1,5}(?:\.\d{1,5})?$
SonarQube 引发了同样的安全错误,我尝试了各种不同的正则表达式模式,但它不起作用。
最佳答案
热点与漏洞
首先请注意,SonarQube 通知您的是安全热点,而不是漏洞。这意味着(引自 the docs ):
A Security Hotspot highlights a security-sensitive piece of code that the developer needs to review. Upon review, you'll either find there is no threat or you need to apply a fix to secure the code.
[...]
With a Hotspot, a security-sensitive piece of code is highlighted, but the overall application security may not be impacted. It's up to the developer to review the code to determine whether or not a fix is needed to secure the code.
这里重要的一点是,SonarQube 并没有告诉你有什么问题。它告诉您应该仔细查看代码以确定是否有问题。
换句话说,它告诉您您的正则表达式可能容易受到 ReDoS 攻击,但实际上并非如此。如果您查看代码并确定不存在漏洞,那么在不更改任何内容的情况下忽略该问题是完全可以的。
那么,SonarQube 究竟为什么要让您查看这段代码呢?
SonarQube 实际上并不检测正则表达式是否容易受到 ReDoS 攻击(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它会标记所有重要的正则表达式,并提醒您检查它们以确定它们是否易受攻击。如 the documentation of the rule 中所述, 它认为任何包含不止一次出现的任何字符
*+{
的正则表达式都是重要的。 .由于根据该标准,您的两个正则表达式都不是微不足道的,因此都被标记了。
更新 :以上适用于编写此答案时的 ReDoS 规则。同时,该规则已被弃用,取而代之的是一条新规则,该规则只应提示实际上具有超线性运行时的正则表达式。新规则没有提示这个问题中的正则表达式。
那么你的代码容易受到攻击吗?
不,您的正则表达式都不容易受到攻击。事实上,这两个表达式中唯一使用的重复运算符是
{}
。并且由于您在所有情况下都提供了上限,因此甚至没有任何无限重复。但是,我想说您的第一个正则表达式足够复杂,以至于成为可读性和维护的噩梦。因此,您应该考虑用另一种方法替换它(例如将字符串拆分为单独的数字并检查每个数字是否在所需的范围内)。
那你该怎么办?
确定正则表达式不易受到攻击后,您应该关闭热点。
在评论中指出,如果您将正则表达式字符串拆分为多个连接字符串或将其移动到变量中,该消息将消失。起作用的原因很简单,就是它欺骗 SonarQube 找不到正则表达式。因此,这种更改不会使您的代码变得更好或更安全,只会使 SonarQube 感到困惑,并且绝不比仅仅关闭消息更可取。通常不建议为了让您的静态分析工具闭嘴而混淆您的代码。
关于javascript - SonarQube 显示正则表达式拒绝服务 (ReDoS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61478960/