我在JavaScript中使用regex验证日期,但当我运行SonarQube进行代码分析时,它显示regex为安全漏洞。它显示regex是一个安全漏洞。
例子1.下面是regex模式(链接到regex源)。
以下是regex模式(链接到regex源码) https:/stackoverflow.coma1550487713353721。):
^(?:(?: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:
对于浮动值,我使用了下面的regex
^\d{1,5}(?:\.\d{1,5})?$
SonarQube正在抛出相同的安全错误,我尝试了各种不同的regex模式,但它没有工作。
首先要注意,SonarQube通知你的是一个安全热点,而不是一个漏洞。这意味着(引用自 文献):
安全热点会突出显示一个安全敏感的代码,开发者需要审查。在审查后,你会发现没有威胁,或者你需要应用一个修复程序来保护代码。
[...]
有了热点,安全敏感代码就会被突出显示,但整体的应用程序安全可能不会受到影响。这取决于开发人员审查代码,以确定是否需要修复以确保代码安全。
这里的重要启示是,SonarQube不是告诉你有什么问题。它是告诉你,你应该仔细查看代码,以确定 是否 有问题。
换句话说,它在告诉你,你的regex 可 是易受ReDoS攻击的,而不是说它实际上是易受攻击的。如果你审查了代码,确定没有漏洞,完全可以不改任何东西,直接否定这个问题。
SonarQube实际上并不检测一个正则表达式是否对ReDoS有漏洞(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它标记了所有非平凡的正则表达式,并提醒你审查它们以确定它们是否脆弱。正如在 规则的文件它认为任何包含一个以上的字符的regex都是非平凡的。*+{
.
由于你的两个正则表达式都是非平凡的那个标准,所以都被标记了。
不,你的两个正则表达式都不存在漏洞。事实上,这两个表达式中唯一使用的重复操作符是 {}
而且由于你在所有情况下都提供了一个上限,所以甚至没有任何无限制的重复。
然而,我想说你的第一个regex足够复杂,是一个可读性和维护的噩梦。所以,你应该考虑用另一种方法来代替它(比如将字符串分割成单个数字,并检查每个数字是否在所需范围内)。
在确定正则表达式没有漏洞后,你应该驳回这个热点。
在评论中指出,如果你把regex字符串拆成多个并列的字符串,或者把它移到一个变量中,这个消息就会消失。这样做的原因很简单,就是欺骗SonarQube,让它找不到regex。所以,这种改变不会让你的代码变得更好或更安全,它只会让SonarQube感到困惑,绝不是比直接驳回消息更可取。一般来说,为了让你的静态分析工具闭嘴而混淆你的代码是不可取的。