我正在调查一些与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)