为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

临摹微笑 2022-07-21 21:11:09
我在 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:对于浮动值,我使用了以下正则表达式^\d{1,5}(?:\.\d{1,5})?$SonarQube 引发了同样的安全错误,我尝试了各种不同的正则表达式模式,但它不起作用。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

热点与漏洞

首先请注意,SonarQube 通知您的是安全热点,而不是漏洞。这意味着(引自文档):

安全热点突出显示开发人员需要审查的安全敏感代码段。经过审查,您会发现没有威胁,或者您需要应用修复程序来保护代码。

[...]

使用热点,一段安全敏感的代码会被突出显示,但整体应用程序的安全性可能不会受到影响。由开发人员检查代码以确定是否需要修复来保护代码。

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

换句话说,它告诉您您的正则表达式可能容易受到 ReDoS 攻击,但实际上并非如此。如果您查看代码并确定不存在漏洞,那么在不更改任何内容的情况下忽略该问题是完全可以的。

那么,SonarQube 究竟为什么要让您查看这段代码呢?

SonarQube 实际上并不检测正则表达式是否容易受到 ReDoS 攻击(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它会标记所有重要的正则表达式,并提醒您检查它们以确定它们是否易受攻击。正如规则文档中所解释的,它认为任何包含不止一次出现的任何字符的正则表达式都是不平凡的*+{

由于根据该标准,您的两个正则表达式都不是微不足道的,因此都被标记了。

更新:以上适用于编写此答案时的 ReDoS 规则。同时,该规则已被弃用,取而代之的是一条新规则,该规则只应抱怨实际上具有超线性运行时的正则表达式。新规则不会抱怨这个问题中的正则表达式。

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

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

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

那你该怎么办?

确定正则表达式不易受到攻击后,您应该关闭热点。

在评论中指出,如果您将正则表达式字符串拆分为多个连接字符串或将其移动到变量中,该消息将消失。起作用的原因很简单,就是它欺骗 SonarQube 找不到正则表达式。因此,这种更改不会使您的代码变得更好或更安全,只会使 SonarQube 感到困惑,并且绝不比仅仅关闭消息更可取。通常不建议为了让您的静态分析工具闭嘴而混淆您的代码。


查看完整回答
反对 回复 2022-07-21
  • 1 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信