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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:10