我正在建立一个网络服务,用户可以上传解压缩并保存到我们服务器的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实例。否则,每个路径名字符串都将转换为抽象路径名,子抽象路径名将根据父路径进行解析。
我解释为:不离开父文件夹。我是否正确?这段代码安全吗?如果现在:解决此安全问题的最佳方法是什么?
答案 0 :(得分:1)
是的,这是可能的。
...子抽象路径名是针对父级解析的。
只是表示在解析子路径时父路径用作 base ,但如果子路径包含..
,则结果将在父路径之外。
E.g。
new File("/Users/example/projects/sample/target", "../pom.xml").getCanonicalFile();
结果为/Users/example/projects/sample/pom.xml
,因此超出target
。
所以,简而言之,是的,你需要自己防范这一点。