我从用户那里获得了一条相对路径,当时它被给出了我不知道它与它有什么关系。我想做的就是确保它不会从我决定相对的位置“逃脱”,即它不是绝对路径,并且不会将目录向上更高到足以超出起点
例如foo.html
很好,foo/bar/../baz.html
很好,甚至是foo/bar/../../baz.html
,但不是foo/bar/../../../baz.html
,因为这个数字太高了。
现在,如果我知道/
是目录分隔符而..
是“chup”说明符,这是相对容易的,但我想在Java中以独立于平台的方式进行。看起来Java已经知道了必要的信息,因为它做了java.io.File
中路径规范化的事情,但我找不到一种方法来“规范化”真正相对的路径。
答案 0 :(得分:3)
如果您使用的是Java 7 +,则可以使用java.nio.file.Path
:
String suspiciousPath = "foo/bar/../../../baz.html";
Path current = Paths.get(".").toAbsolutePath().normalize();
Path test = current.resolve(suspiciousPath).toAbsolutePath().normalize();
System.out.println(current); // /home/vw5Vv0
System.out.println(test); // /home/baz.html
boolean valid = test.startsWith(current);
System.out.println(valid ? "OK" : "DANGEROUS"); // DANGEROUS
PS。不需要.toAbsolutePath().normalize()
来电 - 只是为了清晰起见。
答案 1 :(得分:0)
您正在测试两件事:
这似乎可以解决问题:
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException{
File sourcePathFile = new File("./");
String testPath = "../../";
File testPathFile = new File(testPath);
boolean valid = (!sourcePathFile.getCanonicalPath().startsWith(testPathFile.getCanonicalPath())) && testPathFile.getCanonicalPath().startsWith(sourcePathFile.getCanonicalPath());
System.out.println("Relative to: " + sourcePathFile.getCanonicalPath());
System.out.println("Path: " + testPathFile.getCanonicalPath());
System.out.println("Valid: " + valid);
}
}
答案 2 :(得分:-2)
您可以使用apache" filenameUtils"
库http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FilenameUtils.html
它有一个名为" normalize"的方法。谁做你想做的事
示例:
FilenameUtils.normalize("foo/bar/.."); // => foo/
此类支持Unix和Windows样式名称