Здравствуйте все! пишу FTP-сервер под windows. Каждый подключившийся пользователь получает в распоряжение собственную папку, которую он видит как "/". Выше этой папки он вылезти не может(внутри папки он делает что хотит) Так вот, проблемка вот в чем - юзер может в качестве имени файла написать так или даже на данный момент я поступаю просто: перед выполнением команды удаляю из переданной строки все ".." до тех пор, пока их не останется. Ну вот, вопрос: нормально так?
Идея на мой взгляд правильная, однако рекомендую расширить сигнатуру с ".." до "\.." чтобы избежать случая, когда файл у нас будет называться file..txt И еще, сканируй строку на предмет запрещенных в имени пути символов, а также не забудь про возможность переполнения буфера слишком длинной строкой пути.
Эта, находясь в ~/mydir1/ пользователь должен иметь возможность залить/скачать что-то из ../ Приводи относительный путь в абсолютный и потом проверяй левую часть - она должна быть .../ftp/user_xxx/ Ну а на unix есть chroot именно для этого: http://en.wikipedia.org/wiki/Chroot
Нет. Тебе нужно получить полный путь папки и получить полный путь куда хотят обратиться, исключив все псевдоимена . и .. Тогда уже сравнить - появляется ли строчка с путем папки в начале полного пути обращения полностью или не появляется. Если нет - значит обращаются не туда, куда нужно.. Как сделать resolve всех таких имен автоматически - точно не помню, щас посмотрю может вспомню имя WinAPI
HuXTUS Единственным правильным будет полное раскрытие пути и сравнение прав, иначе FTP-сервер будет неполноценным.
Osen "сравнение прав" это сурово - у меня пользователи могут делать в своей папке всё, что не запрещает файловая система. А в других папках они не могут делать ничего. Вот и все права. "полное раскрытие пути" - дык Partner уже написал замечательную функцию, которая мне должна помочь(наверное о ней говорил Great). Или ты предлагаешь вручную строку разбирать?