0

我正在构建一个网络服务,用户可以在其中上传解压缩并保存到我们服务器的 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 实例。否则,每个路径名字符串都将转换为抽象路径名,并且子抽象路径名将针对父级解析。

我解释为:不离开父文件夹。我是对还是错?这段代码安全吗?如果现在:解决此安全问题的最佳方法是什么?

4

1 回答 1

2

对的,这是可能的。

...子抽象路径名是针对父解析的。

只是表示解析子路径时以父路径为基础,但如果子路径包含..,则结果将在父路径之外。

例如

new File("/Users/example/projects/sample/target", "../pom.xml").getCanonicalFile();

导致/Users/example/projects/sample/pom.xml,因此在 之外target

因此,简而言之,是的,您确实需要自己防范这种情况。

于 2017-06-12T09:56:13.710 回答