首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SonarQube显示正则表达式拒绝服务(ReDoS)

SonarQube显示正则表达式拒绝服务(ReDoS)
EN

Stack Overflow用户
提问于 2020-04-28 11:18:59
回答 1查看 14.9K关注 0票数 10

我正在使用JavaScript中的regex验证日期,但是当我运行SonarQube进行代码分析时。它显示正则表达式是一个安全漏洞。

示例1:

下面是regex模式(链接到regex https://stackoverflow.com/a/15504877/13353721的源代码):

代码语言:javascript
运行
复制
^(?:(?: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:

对于浮动值,我使用了以下正则表达式

代码语言:javascript
运行
复制
^\d{1,5}(?:\.\d{1,5})?$

SonarQube抛出了相同的安全错误,我尝试了各种不同的regex模式,但它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 15:42:27

热点与漏洞

首先,请注意,SonarQube正在通知您的是一个安全热点,而不是漏洞。这意味着(引用医生们):

一个安全热点突出了一段对安全敏感的代码,开发人员需要对其进行审查。审查后,您会发现没有任何威胁,或者需要应用修补程序来保护代码。 ..。 使用Hotspot时,会突出显示对安全敏感的代码,但总体应用程序安全性可能不会受到影响。这取决于开发人员审查代码,以确定是否需要修复来保护代码。

这里最重要的一点是,SonarQube并没有告诉你有什么问题。它告诉您,您应该仔细查看代码,以确定是否有问题。

换句话说,它告诉您正则表达式可能容易受到ReDoS攻击,而不是实际上。如果您检查代码并确定没有漏洞,那么完全可以忽略这个问题而不更改任何内容。

那么,SonarQube为什么要告诉您检查这段代码呢?

SonarQube实际上没有检测到正则表达式是否易受ReDoS攻击(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它标记所有非平凡的正则表达式,并提醒您检查它们是否易受攻击。正如在规则的文件中解释的那样,它认为包含多个字符*+{的任何正则表达式都是非平凡的。

由于这两个正则表达式都是非平凡的,所以这两个表达式都会被标记。

Update__:上面的内容适用于编写此答案时的ReDoS规则。同时,这个规则已经被废弃,取而代之的是一个新的规则,它只应该抱怨实际具有超线性运行时的正则表达式。新规则不抱怨这个问题的准则。

那么你的代码易受攻击吗?

不,你的正则表达式都不容易受攻击。事实上,在这两个表达式中唯一使用的重复运算符是{},而且由于在所有情况下都提供了一个上限,甚至没有任何无界的重复。

但是,我想说,您的第一个正则表达式非常复杂,足以成为可读性和维护性的噩梦。因此,您应该考虑用另一种方法替换它(例如将字符串拆分为单个数字,并检查每个数字是否在所需范围内)。

那你该怎么办?

确定正则表达式不容易受攻击后,应该取消热点。

在注释中指出,如果将regex字符串拆分为多个级联字符串或将其移动到变量中,则消息将消失。起作用的原因很简单,就是它使SonarQube无法找到正则表达式。因此,这样的更改不会使您的代码变得更好或更安全,它只会混淆SonarQube,绝不会比拒绝消息更好。通常不建议混淆您的代码仅仅是为了让您的静态分析工具闭嘴。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61478960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档