我正在使用JavaScript中的regex验证日期,但是当我运行SonarQube进行代码分析时。它显示正则表达式是一个安全漏洞。
示例1:
下面是regex模式(链接到regex 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:
对于浮动值,我使用了以下正则表达式
^\d{1,5}(?:\.\d{1,5})?$
SonarQube抛出了相同的安全错误,我尝试了各种不同的regex模式,但它不起作用。
发布于 2020-04-30 15:42:27
热点与漏洞
首先,请注意,SonarQube正在通知您的是一个安全热点,而不是漏洞。这意味着(引用医生们):
一个安全热点突出了一段对安全敏感的代码,开发人员需要对其进行审查。审查后,您会发现没有任何威胁,或者需要应用修补程序来保护代码。 ..。 使用Hotspot时,会突出显示对安全敏感的代码,但总体应用程序安全性可能不会受到影响。这取决于开发人员审查代码,以确定是否需要修复来保护代码。
这里最重要的一点是,SonarQube并没有告诉你有什么问题。它告诉您,您应该仔细查看代码,以确定是否有问题。
换句话说,它告诉您正则表达式可能容易受到ReDoS攻击,而不是实际上。如果您检查代码并确定没有漏洞,那么完全可以忽略这个问题而不更改任何内容。
那么,SonarQube为什么要告诉您检查这段代码呢?
SonarQube实际上没有检测到正则表达式是否易受ReDoS攻击(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它标记所有非平凡的正则表达式,并提醒您检查它们是否易受攻击。正如在规则的文件中解释的那样,它认为包含多个字符*+{
的任何正则表达式都是非平凡的。
由于这两个正则表达式都是非平凡的,所以这两个表达式都会被标记。
Update__:上面的内容适用于编写此答案时的ReDoS规则。同时,这个规则已经被废弃,取而代之的是一个新的规则,它只应该抱怨实际具有超线性运行时的正则表达式。新规则不抱怨这个问题的准则。
那么你的代码易受攻击吗?
不,你的正则表达式都不容易受攻击。事实上,在这两个表达式中唯一使用的重复运算符是{}
,而且由于在所有情况下都提供了一个上限,甚至没有任何无界的重复。
但是,我想说,您的第一个正则表达式非常复杂,足以成为可读性和维护性的噩梦。因此,您应该考虑用另一种方法替换它(例如将字符串拆分为单个数字,并检查每个数字是否在所需范围内)。
那你该怎么办?
确定正则表达式不容易受攻击后,应该取消热点。
在注释中指出,如果将regex字符串拆分为多个级联字符串或将其移动到变量中,则消息将消失。起作用的原因很简单,就是它使SonarQube无法找到正则表达式。因此,这样的更改不会使您的代码变得更好或更安全,它只会混淆SonarQube,绝不会比拒绝消息更好。通常不建议混淆您的代码仅仅是为了让您的静态分析工具闭嘴。
https://stackoverflow.com/questions/61478960
复制相似问题