Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > функция проверки пути на допустимость


Автор: boostcoder 23.1.2011, 14:40
всем привет.
есть некоторый протокол, посредством которого, в виде jSON структур, юзер отсылает запрос на получение/аплоад файла. у юзера есть свой каталог.
интересует, каким образом, можно проверить указанное юзером _file_path_ на допустимость? т.е. чтоб указанный юзером в запросе файл, находился только в подкаталогах юзера.

к примеру, каталог юзера находится тут: /mnt/users/user1
нужно определить ситуацию, когда указанный юзером файл, находится не в его подкаталогах.
так же, нужно чтоб проверка пути, производилась согласно возможным в *nix форматом записи: ~, $, ../.., /, и т.д...
очень хочется узнать то, что такая функция уже имеется smile

спасибо.

Автор: null56 23.1.2011, 15:47
можно попробовать получать права файла или каталога, а потом проверять uid или guid пользователя, если он принадлежит, то добро, иначе низя, в этом случае, пользователь на сервере должен создавать файлы и каталоги от своего имени, чтобы структурам файловой системы (каталоги, папки) назначались верные права
Код

      int stat(const char *path, struct stat *buf);
       int fstat(int fd, struct stat *buf);
       int lstat(const char *path, struct stat *buf);

struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links */
               uid_t     st_uid;     /* user ID of owner */
               gid_t     st_gid;     /* group ID of owner */
               dev_t     st_rdev;    /* device ID (if special file) */
               off_t     st_size;    /* total size, in bytes */
               blksize_t st_blksize; /* blocksize for file system I/O */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
               time_t    st_atime;   /* time of last access */
               time_t    st_mtime;   /* time of last modification */
               time_t    st_ctime;   /* time of last status change */
           };

Автор: boostcoder 23.1.2011, 16:06
Цитата(null56 @  23.1.2011,  15:47 Найти цитируемый пост)
проверять uid или guid пользователя

пользователя, в терминах *nix, не существует. владельцем всех файлов является программа с которой общаются посредством протокола.

Автор: null56 23.1.2011, 16:19
Цитата(boostcoder @  23.1.2011,  14:40 Найти цитируемый пост)
нужно определить ситуацию, когда указанный юзером файл, находится не в его подкаталогах.

тогда на основании чего осуществлять проверку? если пользователя нет.. получается у тебя есть какое - то имя и ТОЛЬКО имя, тогда о каких проверках может идти речь, если никс не знает о пользователе и соответсвенно о его каталогах?

Автор: boostcoder 23.1.2011, 16:28
Цитата(null56 @  23.1.2011,  16:19 Найти цитируемый пост)
тогда на основании чего осуществлять проверку?

на основании того, что все пути указываемые пользователем, не должны выходить за его каталог. к примеру: /mnt/users/user1

Цитата(null56 @  23.1.2011,  16:19 Найти цитируемый пост)
никс не знает о пользователе и соответсвенно о его каталогах?

по этому, в топике, я не говорил о правах.

если кратко - то есть имя юзера, и его каталог. нужна проверка имен/путей на принадлежность их к его каталогам.

Автор: GrayCardinal 23.1.2011, 17:30
boostcoder
может realpath(3) + strcmp ? 

Автор: MAKCim 23.1.2011, 23:54
man 3 glob
man 3 fnmatch

может то, а может и нет ;)

Автор: boostcoder 24.1.2011, 16:18
GrayCardinalMAKCim, спасибо! то что надо smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)