我正在构建一个网络服务,用户可以在其中上传解压缩并保存到我们服务器的 zip 文件。
我创建了以下函数来打开指定路径中的文件:
private File secureOpenFile(String fileName, String directorypath){
return new File(directorypath, fileName);
}
但是安全扫描告诉我这是不安全的,因为它有路径遍历的可能性。提供参数(“../../notsafe”、“uploadfolder”)将允许恶意攻击者覆盖其他文件......
但是,在 File 类的文档中,我发现了以下内容:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.io.File,%20java .lang.String)
否则,父抽象路径名被用来表示一个目录,而子路径名字符串被用来表示一个目录或一个文件。如果子路径名字符串是绝对的,那么它将以系统相关的方式转换为相对路径名。如果 parent 是空的抽象路径名,则通过将 child 转换为抽象路径名并根据系统相关的默认目录解析结果来创建新的 File 实例。否则,每个路径名字符串都将转换为抽象路径名,并且子抽象路径名将针对父级解析。
我解释为:不离开父文件夹。我是对还是错?这段代码安全吗?如果现在:解决此安全问题的最佳方法是什么?