Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在C中的某个目录之外,如何拒绝用户输入的路径_C_File_User Permissions_Chroot - Fatal编程技术网

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

如果在C中的某个目录之外,如何拒绝用户输入的路径,c,file,user-permissions,chroot,C,File,User Permissions,Chroot,我有一个C程序,它接受一个文件的路径作为用户输入。我希望能够打开该文件,但前提是该文件位于其他路径中。例如,我有以下目录结构: ├── forbidden-file └── directory1 ├── permitted-file1 └── directory2 └── permitted-file2 我想拒绝任何指向directory1外部的路径,相对于directory1。因此,像../forbidden file和directory2/../../for

我有一个C程序,它接受一个文件的路径作为用户输入。我希望能够打开该文件,但前提是该文件位于其他路径中。例如,我有以下目录结构:

├── forbidden-file
└── directory1
    ├── permitted-file1
    └── directory2
        └── permitted-file2
我想拒绝任何指向directory1外部的路径,相对于directory1。因此,像../forbidden file和directory2/../../forbidden file这样的内容将被拒绝,但像allowed-file1、directory2/../allowed-file1和directory2/allowed-file2这样的内容将被允许

我已经对chroot进行了一些研究,但这并不真正适合我的需要,因为在我的示例中,我只需要拒绝用户输入的路径,而让我的程序自由访问directory1之外的任何文件

我现在有点不知所措,所以任何帮助都将不胜感激!
感谢您抽出时间,祝您度过愉快的一天。

处理此类情况的一种行之有效的方法是保留允许路径的白名单或不允许路径的黑名单。下面是一个简单的hello world白名单和黑名单实现,供您参考

#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;
}
用于获取规范绝对路径,并检查其前缀是否为禁止的文件路径。