如果在C中的某个目录之外,如何拒绝用户输入的路径

问题描述 投票:0回答:1

好,所以我有这个C程序,它使用文件的路径作为用户输入。我希望能够打开该文件,但是如果它在另一个路径中,则为[[only。例如,我具有以下目录结构:

├── forbidden-file └── directory1 ├── permitted-file1 └── directory2 └── permitted-file2
并且我想拒绝任何指向directory1外部的路径,相对于directory1。因此../forbidden-filedirectory2/../../forbidden-file之类的东西将被拒绝,但permitted-file1directory2/../permitted-file1directory2/permitted-file2之类的东西将被允许。

我已经研究了chroot了一点,但这并不能满足我的需要,因为我只需要拒绝用户输入的路径,而让程序可以自由访问我的directory1之外的任何文件例如。

我有点不高兴,所以任何帮助将不胜感激!感谢您的宝贵时间,祝您度过愉快的一天。

c file user-permissions chroot
1个回答
0
投票
处理这种情况的一种有效方法是通过对允许的路径保留

白名单或对于不允许的路径保留黑名单。这是白名单以及黑名单实现上的一个简单的hello世界,供您参考。

#include <stdio.h> #include <string.h> #include <libgen.h> #define ENTRIES (3) const char *white_list[ENTRIES]={ "/home/allowed_dir1", "/home/allowed_dir2", "/home/allowed_dir3" }; const char *black_list[ENTRIES]={ "/home/blocked_dir1", "/home/blocked_dir2", "/home/blocked_dir3" }; int check_white_list(char *dirname){ int i=0; for(i=0;i<ENTRIES;i++){ if(strcmp(dirname, white_list[i])==0){ return 0; } } return 1; } int check_black_list(char *dirname){ int i=0; for(i=0;i<ENTRIES;i++){ if(strcmp(dirname, black_list[i])==0){ return 0; } } return 1; } int main(int argc, char *argv[]) { int i = 0; char allowed_file[30] = "/home/allowed_dir0/myfile"; //change paths here for sample //get dir name of myfile char *dir_name = dirname(allowed_file); /* * white list method */ if(check_white_list(dir_name)==0){ printf("match found in white list\n"); }else{ printf("match not found in white list\n"); } /* * black list method */ if(check_black_list(dir_name)==0){ printf("march found in black list\n"); }else{ printf("match not found in black list\n"); } return 0; }
© www.soinside.com 2019 - 2024. All rights reserved.