Por que não FtpWebRequest, ou WebRequest em geral aceitar um caminho /../?
-
20-08-2019 - |
Pergunta
Eu estou tentando automatizar algumas tarefas upload / download de um servidor web ftp. Quando eu conectar ao servidor através de cliente, ou através de Firefox mesmo, a fim de obter para o meu diretório, eu tenho que especificar um caminho como este:
ftp://ftpserver.com/../AB00000/incoming/files
Se eu tentar acessar este:
ftp://ftpserver.com/AB00000/incoming/files
O servidor gera um erro que o diretório não existe. Então, o problema:
Eu estou tentando criar um FtpWebRequest com o primeiro endereço ftp, mas sempre analisa o "/../" parte e depois o meu servidor diz que o caminho não existe.
Eu tentei estes:
Uri target = new Uri("ftp://ftpserver.com/../AB00000/incoming/files");
FtpWebRequest request = (FtpWebRequest)WebReqeuest.Create(target);
e
string target = "ftp://ftpserver.com/../AB00000/incoming/files";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
No primeiro bit, o caminho já está incorreta quando o objeto Uri é instanciado, no segundo bit, é após o método WebRequest.Create. Alguma idéia o que está acontecendo?
EDIT:
Além disso, desde que eu postei isso, eu tentei criar a URI com a opção sem análise. Eu também tentei algo como isto:
string ftpserver = "ftp://ftpserver.com/../";
string path = "12345/01/01/file.toupload";
Uri = new Uri(ftpserver, path, true);
E sempre analisa a parte de raiz ( "/../").
Solução
Tente fugir do .. com algo como:
Uri target = new Uri("ftp://ftpserver.com/%2E%2E/AB00000/incoming/files");
Isso funciona de acordo com este blog que eu descobri nesse discussão .
Outras dicas
Não tenho certeza sobre isso, mas pode ser por razões de segurança, uma vez que permite "/../" URIs seria potencialmente deixar as pessoas navegar livremente no sistema de arquivos de qualquer servidor.
Além disso, o funcionário URI RFC estados que quando resolver um um URI do etapas realizadas na verdade é a remoção de "/../" segmentos, por isso não é um problema na biblioteca C #, mas é um comportamento normal URI.
Você já tentou usar o símbolo @ como assim?
Uri target = new Uri(@"ftp://ftpserver.com/../AB00000/incoming/files");
FtpWebRequest request = (FtpWebRequest)WebReqeuest.Create(target);