当前位置: 首页 > 知识库问答 >
问题:

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

富建章
2023-03-14

我在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个答案

郭知
2023-03-14

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

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

[...]

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

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

换句话说,它告诉你你的正则表达式可能容易受到重做攻击,而不是事实。如果查看代码并确定不存在漏洞,则完全可以在不更改任何内容的情况下忽略该问题。

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

由于根据该标准,您的两个正则表达式都是非平凡的,因此都被标记了。

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

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

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

在确定正则表达式不易受攻击之后,应该忽略热点。

在评论中指出,如果将正则表达式字符串拆分为多个串联字符串或将其移动到变量中,消息将消失。有效的原因很简单,就是它诱使你无法找到正则表达式。因此,这种改变不会让你的代码变得更好或更安全,它只会让SonarQube感到困惑,而且决不会比忽略消息更好。通常不建议仅仅为了让静态分析工具闭嘴而混淆代码。

 类似资料:
  • 问题内容: 在SQL Server(2012)中,我有一个带有数字值的字段。该字段是类型。假设db中的字段包含。我正在这样搜索: 我也尝试过 两者都不起作用。我究竟做错了什么? 问题答案: SQL Server本机不支持正则表达式。为此,您需要安装CLR组件。 该模式语法不支持量词所以不使用CLR的唯一选择是扩大它。

  • 我正在寻找帮助与Java正则表达式请。 我的正则表达式应该只接受长度为5的字符串,字符仅匹配[BDILMOP]。 不允许重复字符-例如,允许使用BDILM,但不允许使用BDILL或BDLLL。 请帮助-我是新的正则表达式,所以会感谢任何建议,你可以扔我的方式。 谢谢

  • 主要内容:简单表达式,字符匹配,实例,实例,匹配 HTML 标签及内容,实例,中括号表达式,替换和分组,其他示例,更多实例简单表达式 正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,如 A,不论出现在搜索字符串中的何处,它总是匹配字母 A。下面是一些单字符正则表达式模式的示例: 可以将许多单字符组合起来以形成大的表达式。例如,以下正则表达式组合了单字符表达式:a、7 和 M。 请注意,没有串联运算符。只须在一个字符后面键入另一个字符。 字符匹配 点号 . 匹配字

  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?

  • 我对特殊字符进行了以下正则表达式验证: 它的工作原理,但它不传递sonarqube,我得到一个安全热点错误: "根据输入字符串评估正则表达式可能是一项极其消耗CPU的任务。巧尽心思构建的正则表达式(如(a)s)将需要几秒钟来计算输入字符串。 问题在于,每向输入中添加一个字符,计算正则表达式所需的时间就会加倍。但是,等效正则表达式s(无分组)以毫秒为单位进行有效计算,并随输入大小线性扩展。" 有没有

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?