如何安全构建文件路径以避免通过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
相关产品推荐
相关产品推荐

