Qual é a melhor maneira de se defender contra um ataque de travessia de caminho?

Eu tenho uma implementação de servidor Java (TFTP, se isso for importante para você) e gostaria de garantir que não seja suscetível a ataques transversais ao caminho, permitindo acesso a arquivos e locais que não deveriam estar disponíveis.

Minha melhor tentativa de defender até agora é rejeitar quaisquer entradas que correspondamFile.isAbsolute() e depois confiarFile.getCanonicalPath() para resolver qualquer../ e./ componentes fora do caminho. Por fim, garanto que o caminho resultante ainda esteja dentro do diretório raiz necessário do meu servidor:

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());
}

Há problemas de segurança que faltam? Há melhor / mais rápido para alcançar o mesmo resultado de maneira confiável?

O código precisa funcionar de forma consistente no Windows e Linux.

questionAnswers(3)

yourAnswerToTheQuestion