gpt4 book ai didi

检查 C/*nix 中指定用户的文件访问权限

转载 作者:太空狗 更新时间:2023-10-29 12:33:48 25 4
gpt4 key购买 nike

这是我的问题。我需要从 FreeBSD 上的 C 代码检查特定文件和特定用户的读取权限。我写了一段代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[]){
int r_ok;

if(setuid(1002)){
printf("Cant's set uid\n");
exit(1);
}

r_ok = access("/tmp/dir", R_OK);
printf("error: %d: %s\n", errno, strerror(errno));
printf("%d\n", r_ok);
return 0;
}

一般情况下它工作正常,但是当我像这样为/tmp/dir 设置权限时:

d---r-x---  2 root  fruit1  512 Sep 10 18:20 /tmp/dir

程序输出

error: 13: Permission denied
-1

虽然 UID 为 1002 的用户是组 fruit1 的有效成员:

# groups 1002
orange fruit1

我将非常乐意提供任何帮助。

最佳答案

setuid() 设置进程的真实有效用户 ID,但不会修改组访问列表,为此您必须调用 setgid ()initgroups()setgroups()

因此您的程序以使用过的 ID 1002 和原始组 ID 和组运行访问列表,而不是用户 1002 的组访问列表。这就解释了为什么该进程没有对该目录的读取权限。

请注意,access() 被认为是一个“安全漏洞”(参见示例 access() Security Hole)。通常最好只是尝试打开文件或目录而不是检查预先读取权限。

关于检查 C/*nix 中指定用户的文件访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com