【问题标题】:Checking file access permissions for specified user in C / *nix在 C / *nix 中检查指定用户的文件访问权限
【发布时间】:2013-09-14 15:12:06
【问题描述】:

这是我的问题。我需要从 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

如有任何帮助,我将不胜感激。

【问题讨论】:

    标签: c linux unix file-permissions freebsd


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢。你的回答很有帮助。我想我可以使用faccessat 而不是access 用于相同的目的。
    猜你喜欢
    • 2011-04-29
    • 2015-05-27
    • 2015-01-11
    • 2018-08-31
    • 2023-03-29
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多