2017-06-12 45 views
0

我正在构建一个web服务,用户可以上传zip文件解压缩并保存到我们的服务器。是否可以使用Javas File构造函数进行路径遍历?

我创建了下面的函数在一个指定的路径打开文件:

private File secureOpenFile(String fileName, String directorypath){ 
     return new File(directorypath, fileName); 
} 

但安全扫描告诉我,这是不是安全的,因为它有路径遍历的可能性。给出的参数(“../../notsafe”,‘uploadfolder’),将允许恶意攻击者改写其他文件...

但是,文件类的文档中,我发现以下几点:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.io.File,%20java.lang.String)

否则,父抽象路径名被用来表示一个目录,子路径名字符串被用来表示目录或文件。如果子路径名字符串是绝对的,那么它将以依赖于系统的方式转换为相对路径名。如果parent是空的抽象路径名,则通过将child转换为抽象路径名并根据系统相关的默认目录解析结果来创建新的File实例。否则,每个路径名字符串都会被转换为一个抽象路径名,并且该子抽象路径名会根据父级进行解析。

其中我解释为:不离开父文件夹。我正确与否?这段代码安全吗?如果现在:解决这个安全问题的最好方法是什么?

+0

你有参数来自用户的任何输入? – ProgrammerBoy

+0

嘿ProgrammerBoy。第二个参数,即文件名,来自用户上传的zip文件。我怀疑用户可以在这个zip文件中加入任何奇怪的东西,所以我不相信这个输入... – rmeertens

回答

1

是的,这是可能的。

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

只是手段解决孩子路径时父路径被用作基地,但如果孩子路径包含..,其结果将是外父。

E.g.

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

导致/Users/example/projects/sample/pom.xml,从而外部的target

所以,简而言之,是的,你需要自己防范这一点。

相关问题