【问题标题】:SonarQube regex security hotspotSonarQube 正则表达式安全热点
【发布时间】:2022-01-17 14:36:21
【问题描述】:

我们正在使用支持MM/DD/YYYY(或)DD/MM/YYYY(或)M/D/YYYY的正则表达式。正则表达式为obj.matches(".*\\d+\\/\\d+\\/[0-9]{4}.*")

但最近,当我们在我们的构建中引入 sonarqube 时,由于这个正则表达式(灾难性回溯正则表达式)而失败。还有其他可以使用的正则表达式吗?

我们正在使用 java-11

【问题讨论】:

    标签: java regex sonarqube java-11


    【解决方案1】:

    任何以无限量化模式(如.*.+)开头然后包含更多子模式的模式都可能由于最终回溯而减慢具有非常大字符串的代码执行速度。

    您需要使用不将搜索锚定在字符串开头和结尾的方法,这样您将消除模式开头和结尾处的.*

    Matcher m = Pattern.compile("\\d+/\\d+/\\d{4}").matcher(obj);
    if (m.find()) {
      // ....
    }
    

    不要转义 / 字符,它们不是特殊的正则表达式元字符。

    上面的模式是您可以将模式缩短为的最佳模式,您可以安全地将正则表达式标记为已审核并且可以使用。

    【讨论】:

    • 您可以通过在此处使用\\d++ 来进一步提高性能,同时禁用数字回溯,因为可以预见数字与/ 字符不匹配。不过,\\d{1,2}\\d\\d? 会更合适。
    猜你喜欢
    • 2020-10-18
    • 2022-01-14
    • 2020-12-29
    • 2019-11-16
    • 2013-07-31
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多