Возможен ли обход пути с помощью конструктора 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
,
Короче говоря, да, вам нужно остерегаться этого.