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

如何安全构建文件路径以避免通过DELETE API访问父目录

如何安全构建文件路径以避免通过DELETE API访问父目录

嘿,这个问题确实是文件操作类API里的经典安全陷阱,我来给你几个在Java里能直接落地的解决方案,帮你堵住路径遍历的漏洞:

  • 用Java NIO的Path API做路径规范化与校验
    这是最可靠的方案,核心思路是把用户输入的路径和你的基准目录合并后,规范化路径并检查它是否始终在基准目录范围内。示例代码大概是这样的:
import java.nio.file.Path;
import java.nio.file.Paths;

// 你的应用固定的基准目录
Path baseDir = Paths.get("/opt/my-app/user-data");
// 用户传入的相对路径
String userInputPath = "user23/mobile"; // 或者可能是恶意的"../other-user"
Path userPath = Paths.get(userInputPath);

// 合并路径并规范化(会自动处理".."、"."这类符号)
Path resolvedPath = baseDir.resolve(userPath).normalize();

// 关键校验:确保规范化后的路径还是在基准目录之下
if (!resolvedPath.startsWith(baseDir)) {
    // 拒绝请求,返回403或者错误提示
    throw new SecurityException("Invalid path: Access to parent directories is not allowed");
}

// 到这里路径是安全的,可以执行删除操作
// Files.deleteIfExists(resolvedPath);

这个方法的优势在于,不管用户输入的路径怎么绕,规范化后都会变成真实的路径结构,再通过startsWith校验就能彻底防止跳出基准目录。

  • 提前过滤恶意路径特征
    作为辅助校验,你可以先检查用户输入的路径里是否包含危险的字符或模式,比如:
if (userInputPath.contains("..") 
    || userInputPath.startsWith("/") 
    || userInputPath.startsWith("\\") // Windows环境下的绝对路径开头
    || userInputPath.contains("/../") 
    || userInputPath.contains("\\..\\")) {
    throw new IllegalArgumentException("Path contains invalid characters or patterns");
}

不过要注意,这个方法只能做初步过滤,不能完全依赖——因为有些攻击者可能会用编码后的字符绕过,所以必须和第一种方法配合使用。

  • 限制应用进程的文件系统权限
    这属于“纵深防御”的范畴:给运行你的Java应用的进程设置最小权限,让它只能访问/opt/my-app/user-data这个目录,就算万一前面的校验被绕过,进程也没有权限去删除系统文件或者其他用户的目录。比如在Linux系统里,可以创建专门的用户来运行应用,只给这个用户分配目标目录的读写权限。

另外还有个小细节:如果你的应用需要处理符号链接,记得用Path.toRealPath()来解析真实路径,避免被符号链接引导到基准目录外的地方;如果不需要支持符号链接,也可以在校验时检查路径是否包含符号链接。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:19:50