lastindexof路劲穿越
时间: 2025-03-04 11:22:46 浏览: 17
Java 中 lastIndexOf
的路径遍历问题
在 Web 应用程序中,使用 String.lastIndexOf()
方法来处理文件路径可能会引入路径遍历漏洞。如果应用程序允许用户输入作为文件路径的一部分,并且未经过充分验证,则恶意用户可以通过提供特殊字符(如 ../
)访问受限区域之外的文件。
问题描述
当通过 fileName.lastIndexOf(".")
获取文件扩展名时,如果没有对传入参数做严格校验,攻击者可能利用此方法绕过安全机制。例如,在获取文件后缀名的过程中:
suffixName = fileName.substring(fileName.lastIndexOf("."), fileName.length());
这段代码假设所有的点号都用于分隔文件名和其扩展名[^1]。然而,实际情况下,攻击者可以构造类似这样的字符串 "....//example.txt"
或其他形式的路径穿越序列,从而改变预期的行为并可能导致任意文件读取或其他危险操作。
解决方案
为了防止这种类型的攻击,应该采取以下措施之一或组合使用:
白名单过滤:只接受已知的安全字符集内的输入值;对于文件上传场景来说就是限定合法的文件类型列表。
规范化路径:确保任何由外部提供的相对路径都被转换成绝对路径后再继续后续逻辑之前。这通常涉及到移除多余的斜杠以及解析掉所有
.
和..
组件直到不能再简化为止。检查父级目录:确认最终得到的目标位置确实位于指定的基础存储空间内部而不是越界指向了不该触及的地方。
具体实现上可参照如下改进后的伪代码片段展示如何更稳妥地提取文件扩展名而不受上述风险影响:
import org.apache.commons.io.FilenameUtils;
public class FileUploadHandler {
public void handleFileUpload(MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
// 使用 Apache Commons IO 工具类中的方法代替手动索引计算
String extension = FilenameUtils.getExtension(originalFilename);
if (extension.isEmpty() || !isValidFileType(extension.toLowerCase())) {
throw new IllegalArgumentException("Invalid or missing file type.");
}
Path targetPath = Paths.get("/safe/base/path", UUID.randomUUID().toString() + "." + extension).normalize();
Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("File uploaded successfully at " + targetPath.toString());
}
private boolean isValidFileType(String fileType){
Set<String> allowedTypes = new HashSet<>(Arrays.asList("jpg","png","pdf"));
return allowedTypes.contains(fileType);
}
}
在这个例子中,采用了第三方库 Apache Commons IO
来帮助处理文件名称解析工作 (FilenameUtils.getExtension
) 并且增加了额外的一层保护——即生成唯一的随机文件名以避免覆盖现有资源的同时也减少了预测性。此外还实现了简单的 MIME 类型白名单验证机制[^2]。
阅读全文
相关推荐

















