У меня есть реализация сервера Java (TFTP, если это имеет для вас значение), и я хотел бы убедиться, что он не подвержен атакам обхода пути, позволяющим доступ к файлам и местоположениям, которые не должны быть доступны.
Моя лучшая попытка защитить до сих пор - отклонить любые записи, которые соответствуют File.isAbsolute()
, а затем полагаться на File.getCanonicalPath()
, чтобы разрешить любые компоненты ../
и ./
выйти из пути. Наконец, я гарантирую, что результирующий путь все еще находится в пределах требуемого корневого каталога моего сервера:
public String sanitize(final File dir, final String entry) throws IOException {
if (entry.length() == 0) {
throw new PathTraversalException(entry);
}
if (new File(entry).isAbsolute()) {
throw new PathTraversalException(entry);
}
final String canonicalDirPath = dir.getCanonicalPath() + File.separator;
final String canonicalEntryPath = new File(dir, entry).getCanonicalPath();
if (!canonicalEntryPath.startsWith(canonicalDirPath)) {
throw new PathTraversalException(entry);
}
return canonicalEntryPath.substring(canonicalDirPath.length());
}
Есть ли проблемы с безопасностью, которые не хватает? Лучше/быстрее добиться надежного результата?
Код должен работать последовательно в Windows и Linux.