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
相关产品推荐
相关产品推荐

