【发布时间】:2020-10-18 15:07:15
【问题描述】:
我将 SonarQube 用于我的项目,并且我有 "^.\+json[;]?\s$" 的安全热点:
return mediaType != null
&& (MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)
|| mediaType.getSubtype().matches("^.*\\+json[;]?\\s*$"));
}
Hier 是来自 SonarQube 的消息,
使用正则表达式是安全敏感的。它过去曾导致以下漏洞:
根据输入字符串评估正则表达式可能是一项非常耗费 CPU 的任务。特制的正则表达式(例如 (a+)+s)将需要几秒钟来评估输入字符串 aaaaaaaaaaaaaaaaaaaaaaaaaaaabs。问题在于,每向输入中添加一个字符,评估正则表达式所需的时间就会加倍。但是,等效的正则表达式 a+s(没有分组)可以在毫秒内高效计算,并随输入大小线性缩放。
评估此类正则表达式为正则表达式拒绝服务 (ReDoS) 攻击打开了大门。在 Web 应用程序的上下文中,攻击者可以强制 Web 服务器花费其所有资源来评估正则表达式,从而使真正的用户无法访问该服务。
此规则标记硬编码正则表达式的任何执行,该正则表达式至少包含 3 个字符和至少两个以下任何字符的实例:*+{。
示例:(a+)*
例外
对 String.split(regex) 和 String.split(regex, limit) 的调用不会引发异常,尽管它们使用了正则表达式。这些方法大部分时间用于拆分不会造成任何漏洞的简单正则表达式。
为什么?我该如何解决?
【问题讨论】: