CWE 73漏洞修复:Java HttpServletRequest.getQueryString触发Veracode漏洞如何解决
CWE-73 外部控制文件名或路径漏洞修复方案
出现ESAPI校验后仍被扫描出漏洞的核心原因是静态扫描工具未识别到你的防护逻辑覆盖了路径遍历风险,可按以下步骤逐层加固:
- 第一步:先做URL解码再校验,避免编码绕过
攻击者常用URL编码的路径遍历字符(如%2e%2e%2f对应../)绕过正则校验,需要先解码再做校验逻辑:import java.net.URLDecoder; import java.nio.charset.StandardCharsets; String rawQuery = httpServletRequest.getQueryString(); if (rawQuery == null) { rawQuery = ""; } // 先解码查询字符串 String decodedQuery = URLDecoder.decode(rawQuery, StandardCharsets.UTF_8.name()); - 第二步:使用严格的校验正则,限制允许的输入字符
原有的QueryStringRegEx如果过于宽松(比如允许无限制的.、/、\字符),扫描器会判定校验无效。建议根据业务场景严格限制输入范围,示例正则仅允许查询字符串常用的合法字符:// 正则可根据业务需要调整,默认禁止/ \ 等路径相关字符,同时限制最大输入长度 String safeQuery = ESAPI.validator().getValidInput( "QueryString", decodedQuery, "^[a-zA-Z0-9&=_\-%?]*$", 256, // 限制最大输入长度,避免超长字符串攻击 false ); - 第三步:路径使用前增加根目录限制(核心防护逻辑)
CWE-73的核心风险是外部输入可控文件路径,如果你后续需要用查询字符串拼接文件路径,必须增加路径合法性校验,确认最终路径落在允许的目录范围内:import java.io.File; // 定义允许访问的根目录,固定为业务需要的路径 File allowedRoot = new File("/opt/app/authorized_dir/").getCanonicalFile(); // 构造目标文件对象并做路径规范化 File targetFile = new File(allowedRoot, safeQuery).getCanonicalFile(); // 校验最终路径是否在允许的根目录下,彻底阻断路径遍历风险 if (!targetFile.getPath().startsWith(allowedRoot.getPath())) { throw new SecurityException("非法路径访问请求"); }
完成以上三步后,Veracode扫描即可识别到完整的防护逻辑,不会再误报漏洞。如果仍有告警,可提交扫描规则例外申请,说明已完成输入校验+路径合法性校验的双层防护。
内容的提问来源于stack exchange,提问作者Mahesh Kulkarni
相关产品推荐
相关产品推荐

