java 防御路径遍历攻击的核心是在文件名提取、路径拼接和存储环节阻断,而非解析恶意路径;须标准化文件名、禁用字符串拼接、强制用 paths.resolve() 并校验路径是否在白名单内,配合扩展名白名单、mime 检测等纵深防护。

Java 安全解析用户上传的“恶意路径文件”,核心不是“解析”它,而是在文件名、路径拼接、存储环节就彻底阻断路径遍历(Path Traversal)攻击。所谓“恶意路径文件”,通常指用户伪造的文件名,如 ../../../etc/passwd 或 img.png%00../webshell.jsp,意图突破上传目录限制、覆盖系统文件或触发服务端执行。Java 本身不“解析”这种路径来读取危险内容——真正危险的是开发者用它去构造 File 或 Path 对象并执行写入/读取操作。
严格标准化原始文件名,剥离所有路径成分
永远不要直接使用 MultipartFile.getOriginalFilename() 拼接路径。该值完全由客户端控制,可含 ../、\、%2e%2e%2f、空字节等绕过手法。
- 提取纯文件名:用
Paths.get(filename).getFileName().toString()获取最后一段(自动忽略上级路径) - 进一步清洗:移除不可见字符(如
\u202ERTL)、控制字符、空字节(\0),推荐用正则filename.replaceAll("[^a-zA-Z0-9._-]", "_") - 示例:
../../../web.config→web.config;photo.jpg%00../shell.jsp→photo.jpg_.._shell.jsp
禁用路径拼接,强制使用安全存储路径
绝对禁止字符串拼接构建目标文件路径,例如 new File(uploadDir + "/" + filename)。必须用 Paths.get() 和 resolve() 确保路径落在白名单目录内。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义可信根目录:
Path uploadRoot = Paths.get("/opt/app/uploads").toAbsolutePath().normalize() - 构造目标路径:
Path target = uploadRoot.resolve(safeFilename).normalize() - 关键校验:
if (!target.startsWith(uploadRoot)) { throw new SecurityException("非法路径访问"); } - 此校验能拦截
../../etc/shadow、/tmp/malware等所有越界尝试
配合其他基础防护,形成纵深防御
路径防护只是第一道关卡,需与类型、内容、权限策略协同:
-
扩展名白名单:仅允许
.jpg、.pdf、.xlsx等业务必需后缀,拒绝.jsp、.php、.sh -
真实 MIME 类型检测:用
Files.probeContentType()或 Apache Tika 读取文件头,不依赖客户端Content-Type -
PDF/Office 等富文档专项消毒:对 PDF 调用
PDFBox清除/JS、/OpenAction等危险对象;对 Office 文档检查宏和外部链接 -
存储权限最小化:上传目录设为
noexec,nosuid(Linux),Web 服务器以低权限用户运行,禁止脚本执行
避免常见误区
很多看似“加固”的做法实际无效:
- 只过滤
../字符串:攻击者可用....//、%2e%2e%2f、Unicode 编码绕过 - 先
URLDecode再校验:可能引发双重解码漏洞(如%252e%252e%252f→%2e%2e%2f→../) - 信任
Content-Disposition或Content-Type:全部可被篡改,不能作为安全依据 - 前端 JS 校验:仅作体验优化,后端必须完整重做所有校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










