Как отклонить введенные пользователем пути, если они находятся за пределами определенного каталога в C - PullRequest
0 голосов
/ 12 апреля 2020

Хорошо, поэтому у меня есть C программа, которая принимает, как ввод пользователя, путь к файлу. Я хочу иметь возможность открыть этот файл, но только , если он находится по другому пути. Например, у меня есть такая структура каталогов:

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

, и я хочу отклонить любые пути, которые указывают за пределы directory1, относительно directory1. Поэтому такие вещи, как ../forbidden-file и directory2/../../forbidden-file будут отклонены, но такие вещи, как permitted-file1, directory2/../permitted-file1 и directory2/permitted-file2 будут разрешены.

Я немного изучил chroot, но это не совсем соответствует моим потребностям, потому что мне нужно только отклонять пути, введенные пользователем, и в то же время оставлять в моей программе свободный доступ к любым файлам за пределами directory1.

Я немного озадачен в минуту, поэтому любая помощь будет принята с благодарностью! Спасибо за ваше время и хорошего дня.

1 Ответ

1 голос
/ 12 апреля 2020

Один проверенный способ обработки такого сценария ios заключается в сохранении белого списка для разрешенных путей или черного списка для недопустимых путей. Вот простой привет мир в белом списке, а также реализация черного списка для вашей справки.

#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;
}
...