Возможен ли обход пути с помощью конструктора Javas File?

Я создаю веб-сервис, где пользователи могут загружать zip-файлы, которые распаковываются и сохраняются на нашем сервере.

Я создал следующую функцию, чтобы открыть файл по указанному пути:

private File secureOpenFile(String fileName, String directorypath){
        return new File(directorypath, fileName);
}

Но проверка безопасности говорит мне, что это небезопасно, поскольку имеет возможность обхода пути. Предоставление аргументов ("../../notsafe", "uploadfolder") позволит злоумышленнику перезаписать другие файлы...

Однако в документации класса File я обнаружил следующее: https://docs.oracle.com/javase/7/docs/api/java/io/File.html

В противном случае родительский абстрактный путь используется для обозначения каталога, а дочерний путь - для обозначения каталога или файла. Если дочерняя строка пути является абсолютной, то она преобразуется в относительный путь системно-зависимым способом. Если parent является пустым абстрактным путем, то новый экземпляр файла создается путем преобразования дочернего элемента в абстрактный путь и разрешения результата в системно-зависимом каталоге по умолчанию. В противном случае каждая строка пути преобразуется в абстрактный путь, а дочерний абстрактный путь разрешается относительно родительского.

Который я интерпретировал как: не покидает родительскую папку. Я прав или нет? Этот код безопасен? И если сейчас: что будет лучшим способом решить эту проблему безопасности?

1 ответ

Решение

Да, это возможно.

... дочерний абстрактный путь разрешается относительно родительского.

просто означает, что родительский путь используется в качестве основы при разрешении дочернего пути, но если дочерний путь содержит ..результат будет за пределами родительского.

Например

new File("/Users/example/projects/sample/target", "../pom.xml").getCanonicalFile();

результаты в /Users/example/projects/sample/pom.xmlТаким образом, за пределами target,

Короче говоря, да, вам нужно остерегаться этого.

Другие вопросы по тегам