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.