You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortify扫描检出正则表达式拒绝服务漏洞,求修复方案

正则表达式拒绝服务(DoS)漏洞修复方案

漏洞原因

你的代码中,len取自用户输入字符串的长度,构造的正则表达式为[0-9]{N}(N = len-1)。若用户输入超长字符串,N会变得极大,正则引擎在执行匹配时会消耗大量CPU与内存资源,进而引发服务不可用,这正是Fortify检测到的DoS风险点。

修复方案

  • 限制重复次数上限
    给len-1设定一个业务允许的合理最大值,避免生成重复次数过大的正则表达式,同时处理len=0导致的负数情况:

    int len = inputString.length();
    int maxAllowedRepeat = 100; // 根据业务场景调整此值
    int repeatCount = Math.max(0, Math.min(len - 1, maxAllowedRepeat));
    Pattern p = Pattern.compile("[0-9]{" + repeatCount + "}");
    
  • 替换为非正则校验逻辑
    如果需求是校验字符串是否由len-1个数字组成,直接用字符串操作替代正则,彻底规避正则引擎的性能风险:

    int len = inputString.length();
    int requiredDigitCount = len - 1;
    boolean isValid = false;
    
    if (requiredDigitCount > 0) {
        // 假设target是需要校验的目标字符串
        if (target.length() == requiredDigitCount) {
            isValid = true;
            for (char c : target.toCharArray()) {
                if (!Character.isDigit(c)) {
                    isValid = false;
                    break;
                }
            }
        }
    }
    
  • 使用安全正则引擎
    若必须使用正则,可选择线性时间复杂度的正则库(如Google re2j),这类库不会因重复次数过大导致性能爆炸:

    int len = inputString.length();
    int repeatCount = len - 1;
    if (repeatCount >= 0) {
        RE2Pattern p = RE2Pattern.compile("[0-9]{" + repeatCount + "}");
        // 执行匹配逻辑
    }
    

内容的提问来源于stack exchange,提问作者Sri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:48:26