Почему FTPWebRequest или WebRequest вообще не принимают путь /../? - PullRequest
3 голосов
/ 26 января 2009

Я пытаюсь автоматизировать некоторые задачи загрузки / выгрузки с веб-сервера ftp. Когда я подключаюсь к серверу через клиента или даже через Firefox, чтобы попасть в мой каталог, я должен указать путь, подобный этому:

ftp://ftpserver.com/../AB00000/incoming/files

Если я попытаюсь получить доступ к этому:

ftp://ftpserver.com/AB00000/incoming/files

Сервер выдает ошибку, что каталог не существует. Итак, проблема:

Я пытаюсь создать FTPWebRequest с первым адресом ftp, но он всегда анализирует часть "/../", а затем мой сервер говорит, что путь не существует.

Я пробовал это:

    Uri target = new Uri("ftp://ftpserver.com/../AB00000/incoming/files");
FtpWebRequest request = (FtpWebRequest)WebReqeuest.Create(target);

и

string target = "ftp://ftpserver.com/../AB00000/incoming/files";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);

В первом бите путь уже неправильный, когда создается экземпляр объекта Uri, во втором бите - после метода WebRequest.Create. Есть идеи, что происходит?

EDIT:

Кроме того, с момента публикации я попытался создать URI с параметром no parse. Я также пробовал что-то вроде этого:

string ftpserver = "ftp://ftpserver.com/../";
string path = "12345/01/01/file.toupload";

Uri = new Uri(ftpserver, path, true);

И он всегда анализирует корневую часть ("/../").

Ответы [ 3 ]

10 голосов
/ 06 февраля 2009

Попробуйте убежать .. с чем-то вроде:

Uri target = new Uri("ftp://ftpserver.com/%2E%2E/AB00000/incoming/files");

Это работает согласно этому блогу , который я нашел в этом обсуждении .

3 голосов
/ 06 февраля 2009

Не совсем уверен в этом, но это может быть из соображений безопасности, так как разрешение "/../" URI потенциально позволит людям свободно перемещаться по файловой системе любого сервера.

Кроме того, официальный URI RFC гласит, что при разрешении URI одним из выполняемых шагов фактически является удаление сегментов "/../", поэтому это не проблема в библиотеке C #, но это обычное поведение URI.

0 голосов
/ 26 января 2009

Вы пробовали использовать символ @ как так?

Uri target = new Uri(@"ftp://ftpserver.com/../AB00000/incoming/files");
FtpWebRequest request = (FtpWebRequest)WebReqeuest.Create(target);
...