小编gui*_*lum的帖子

带有尾部".."的Java文件canonicalPath会导致行为不一致

我正在调查一些与pathTraversal相关的安全机制,并遇到了java.io.File.getCanonicalPath()的奇怪行为.我认为CanonicalPath将始终代表抽象底层文件的真正唯一路径.但是,如果文件名包含两个点后跟一个空格,则CanonicalPath似乎不再代表正确的路径.

这是一个例子:

File root = new File("c:/git/");
String relative = ".. /.. \\";
File concatFile = new File (root.getCanonicalPath(), relative);

System.out.println("ConcatFileAbsolute: '" + concatFile.getAbsolutePath() + "'");
System.out.println("ConcatFileCanonical: '" + concatFile.getCanonicalPath() + "'");

File canonFile = new File(concatFile.getCanonicalPath());
System.out.println("\ncanonFileCanonical: '" + canonFile.getCanonicalPath() + "'");
System.out.println("canonFileAbsolute: '" + canonFile.getAbsolutePath() + "'");
System.out.println("canonFileName: '" + canonFile.getName() + "'\n");

for (File file : canonFile.listFiles()) {
    System.out.println("canon: '" + file.getCanonicalPath() + "' - absolute: '" + file.getAbsolutePath()+ "'");
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

ConcatFileAbsolute: 'C:\git\.. \.. '
ConcatFileCanonical: …
Run Code Online (Sandbox Code Playgroud)

java nio canonical-link

6
推荐指数
1
解决办法
115
查看次数

标签 统计

canonical-link ×1

java ×1

nio ×1