测试相对路径是否会向上移动

时间:2014-08-14 17:58:42

标签: java

我从用户那里获得了一条相对路径,当时它被给出了我不知道它与它有什么关系。我想做的就是确保它不会从我决定相对的位置“逃脱”,即它不是绝对路径,并且不会将目录向上更高到足以超出起点

例如foo.html很好,foo/bar/../baz.html很好,甚至是foo/bar/../../baz.html,但不是foo/bar/../../../baz.html,因为这个数字太高了。

现在,如果我知道/是目录分隔符而..是“chup”说明符,这是相对容易的,但我想在Java中以独立于平台的方式进行。看起来Java已经知道了必要的信息,因为它做了java.io.File中路径规范化的事情,但我找不到一种方法来“规范化”真正相对的路径。

3 个答案:

答案 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)

您正在测试两件事:

  1. "来源" path(事物应该相对于的路径)不应该以测试路径开始。
  2. 测试路径应该以" source"开头。路径。
  3. 这似乎可以解决问题:

    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样式名称