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

How to reject user inputted pathes if outside of a certain directory in C

好的,我有这个 C 程序,它接受文件路径作为用户输入。我希望能够打开该文件,但 如果它在另一个路径中。例如,我有这样的目录结构:

├── forbidden-file
└── directory1
    ├── permitted-file1
    └── directory2
        └── permitted-file2

并且我想拒绝任何指向 directory1 之外的相对于 directory1 的路径。所以像 ../forbidden-filedirectory2/../../forbidden-file 这样的东西会被拒绝,但是像 permitted-file1directory2/../permitted-file1directory2/permitted-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;
}