让我说我的路径/home/sn/stuff/
。用户现在输入../secretStuff/secret.txt
。现在用户在/home/sn/secretStuff
并且可以读取其中的所有内容。
如何阻止这种情况发生?是否可以在用户输入的路径中容忍任何..
答案 0 :(得分:2)
有多种方法可以打破监狱":
由于您没有真正指定方案,因此很难说您正在考虑哪种类型的潜在攻击,以及您希望避免它们走多远。
你至少应该理智地检查用户的输入(例如使用realpath
,这比用户输入自己的字符串解析更可靠,并涵盖绝对,相对和其中包含软链接的路径。)
您可能希望禁止访问硬链接(使用fstat
并检查nlink_t
)。
根据所需的安全级别,您可能还需要检查chroot
,这样您就可以选择用户甚至可以查看系统。但这需要一些额外的"管道"。
答案 1 :(得分:0)
如果我理解正确,您希望将用户绑定到文件夹中。您可能希望使用strncmp检查基本文件夹是否与您的jail匹配:
#include <stdio.h> /* printf, fprintf */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE */
#include <string.h> /* strncmp */
#define JAIL_FOLDER "/home/user"
int main(int argc, char **argv)
{
if (argc < 2)
return EXIT_FAILURE;
if (strncmp(argv[1], JAIL_FOLDER, strlen(JAIL_FOLDER)) != 0)
{
fprintf(stderr, "Error, folder outside of jail\n");
return EXIT_FAILURE;
}
printf("Access Granted to Folder\n");
return EXIT_SUCCESS;
}
但是,如果用户已经在文件夹中并使用相对路径,则此方法需要进行一些解析。