Какой лучший способ защиты от атаки обхода пути?

У меня есть реализация 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.

Ответы на вопрос(3)

Ваш ответ на вопрос