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
    进行检查,它将成功。