如何修复CWE 73外部控制文件名或路径(new File)漏洞
CWE-73(外部控制文件路径)漏洞修复方案
问题原因
你的代码直接使用从数据库获取的this.Dir创建File对象,未做任何安全校验。攻击者可通过篡改数据库中的路径值,访问服务器上的敏感目录(如系统配置目录、应用私密文件目录等),触发CWE-73漏洞。
可行修复方案
1. 路径白名单校验
预先定义允许访问的合法目录列表,先对this.Dir做标准化处理(消除../这类路径跳转符),再校验是否在白名单内,不合法则直接阻断操作:
import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Set; // 示例代码 String dirPath = this.Dir; Set<String> allowedDirs = new HashSet<>(Arrays.asList( "/opt/app/batch_files", "/var/log/app_uploads" )); try { // 标准化路径,获取绝对路径 File normalizedDir = new File(dirPath).getCanonicalFile(); String normalizedPath = normalizedDir.getAbsolutePath(); if (!allowedDirs.contains(normalizedPath)) { throw new SecurityException("禁止访问非法路径:" + normalizedPath); } // 校验通过后才创建文件夹对象 File folder = normalizedDir; File[] listOfFiles = folder.listFiles(); // 后续业务逻辑... } catch (IOException e) { // 处理路径标准化异常 e.printStackTrace(); }
2. 根目录边界校验
预设一个允许访问的根目录,标准化this.Dir后,校验其是否为该根目录的子目录,防止跳出允许的范围:
import java.io.File; import java.io.IOException; // 示例代码 String rootAllowedDir = "/opt/app/allowed_root"; String dirPath = this.Dir; try { File requestedDir = new File(dirPath).getCanonicalFile(); String requestedPath = requestedDir.getAbsolutePath(); File rootDir = new File(rootAllowedDir).getCanonicalFile(); String rootPath = rootDir.getAbsolutePath(); // 确保请求路径是根目录的子目录 if (!requestedPath.startsWith(rootPath + File.separator)) { throw new SecurityException("路径超出允许范围:" + requestedPath); } File folder = requestedDir; File[] listOfFiles = folder.listFiles(); // 后续业务逻辑... } catch (IOException e) { e.printStackTrace(); }
3. 数据库层加固
在数据库层面限制this.Dir对应的字段值:
- 仅允许存储预先审核过的合法路径,禁止随意修改
- 添加数据库CHECK约束,确保路径符合预设的格式或范围
- 业务逻辑层更新该字段时,先做白名单校验,再写入数据库
关键说明
- 路径标准化(
getCanonicalFile())必须做,它会自动解析../、./等跳转符,避免路径遍历攻击 - 白名单校验是最安全的方式,优先使用;根目录边界校验适合需要动态子目录的场景
- 不要依赖客户端或前端校验,必须在服务端(包括数据库层)做严格校验
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

