Java 测试相对路径是否向上移动
我从用户那里得到了一个相对路径,在给出它的时候,我不知道它是相对于什么的。我所要做的就是确保它不会从我决定使它相对的地方“逃逸”,也就是说,它不是一个绝对路径,并且不会将目录向上更改到足以超出起始点的高度 例如,Java 测试相对路径是否向上移动,java,Java,我从用户那里得到了一个相对路径,在给出它的时候,我不知道它是相对于什么的。我所要做的就是确保它不会从我决定使它相对的地方“逃逸”,也就是说,它不是一个绝对路径,并且不会将目录向上更改到足以超出起始点的高度 例如,foo.html很好,foo/bar/./baz.html很好,甚至foo/bar/../../../baz.html,但不是foo/bar/../../../../baz.html,因为价格太高了 现在,如果我知道/是目录分隔符,而是“chup”说明符,那么这就相对容易了。是“chup
foo.html
很好,foo/bar/./baz.html
很好,甚至foo/bar/../../../baz.html
,但不是foo/bar/../../../../baz.html
,因为价格太高了
现在,如果我知道/
是目录分隔符,而是“chup”说明符,那么这就相对容易了。
是“chup”说明符,但我想在Java中以独立于平台的方式来做。看起来Java已经知道了必要的信息,因为它可以在Java.io.File
中对路径进行规范化,但我找不到一种方法来“规范化”真正相对的路径。如果使用Java 7+,可以使用:
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
另外,不需要
.toabsolutionPath().normalize()
调用-它们只是为了清晰起见。您可以使用apache“filenameUtils”库
它有一个名为“normalize”的方法,它完全按照您的要求执行操作
例如:
FilenameUtils.normalize("foo/bar/.."); // => foo/
此类支持Unix和Windows样式名称您正在测试两个方面:
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);
}
}
Java中有类似DirectorySpeparatorChar的东西。我不确定是否有类似的事情发生在
。
。是否有任何系统。。“上一个目录”不是说明符吗?@KevinWorkman我不知道,但这就是重点:我不知道。未知未知和所有。谢谢,这几乎是完美的,除了它仍然允许用户提交恰好在我的工作目录中的路径。通过使用您展示的技术对/1
和/2
进行测试,我能够解决这个问题。我不确定我是否正确理解您。/1.txt
难道不是有效的路径吗?我的意思是我正在使用current1=path.get(“.”)解析(“1”)
和current2=path.get(“.”)。解析(“2”)
,然后根据current1
和current2
解析并检查可疑路径。因此,例如,如果他们提交/home/vw5Vv0/foo
,它将失败。如果我只根据/home/vw5Vv0
进行检查,它将成功。