- 论坛徽章:
- 0
|
系统如何验证文件的读写权
原帖由 "mhmdanger" 发表:
系统是不是根据进程的有效用户id与要访问的文件属主是否一致从而来判断
该进程对该文件的访问权限,如果是的话,那么到底是谁来进行验证的?
[code
为什么不能是进程本身呢?我们简化的看一下这个问题,假定我们只看读权限问题
而且,不考虑对于全路径的前缀各级目录的执行权,事实上,这个可以通过封装一
个函数来实现。unix下,cat,more,pg,less,sort等,都需要读取文件(这里是
广义的文件,unix下打开设备,或者其他特殊文件都是和普通文件一样)第一个动作
就是open,在此,我们可以在open这个动作里面判定权限是否可以实现
#include <sys/stat.h>
#include <unistd.h>
/* 是否具有读权限 */
/* 0 - 没有权限
1 - 有权限
-1 - 出错 */
int
hv_rd_prmsn(...)
{
uid_t euid = geteuid();
uid_t egid = getegid();
struct stat buf;
/* 读取inode的内容 */
if (stat(filename, buf) < 0)
return printf("cannot stat %$1s : %$2s\n", filename, strerror(errno)),
- 1;
/* 是否具有读权限 */
if (! (euid == buf.st_uid
&& S_IRUSR(buf.st_mode))
&& ! (egid == buf.st_gid
&& S_IRGRP(buf.st_mode))
&& ! S_IROTH(buf.st_mode))
return printf("permission denied open %$1s : %$2s\n", filename, strerro
r(errno)), 0;
/* 读权限满足,继续后续处理 */
...
return 1;
}
在open这个函数里,就可以调用hv_rd_prmsn(const char *)这个函数来判定
[/code] |
|