好,所以我有这个C程序,它使用文件的路径作为用户输入。我希望能够打开该文件,但是如果它在另一个路径中,则为[[only。例如,我具有以下目录结构:
├── 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
之外的任何文件例如。我有点不高兴,所以任何帮助将不胜感激!感谢您的宝贵时间,祝您度过愉快的一天。
白名单或对于不允许的路径保留黑名单。这是白名单以及黑名单实现上的一个简单的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;
}