小编Gav*_*ard的帖子

在fopen()之后使用stat()来避免TOCTOU问题?

标题说明了一切:可以使用stat() 之后 fopen()避免使用时间(TOCTOU)竞争条件吗?

一些细节:

我正在编写一个读取文件的C程序,但在被要求读取目录时需要正确错误.截至目前,它使用open()(与O_RDWR),以产生一个错误,然后检查errnoEISDIR,像这样:

int fd = open(path, O_RDWR);

if (fd == -1) {
    if (errno == EISDIR) return PATH_IS_DIR;
    else return FILE_ERR;
}
Run Code Online (Sandbox Code Playgroud)

上述解决方案的问题是该程序只需要读取文件,因此通过打开文件O_RDWR,如果用户具有读取权限,但可能错误地获取权限错误,而不是写入权限.

是否可以采取以下措施以避免TOCTOU竞争条件?

struct stat pstat;

FILE *f = fopen(path, "r");

if (!f) return FILE_ERR;

if (stat(path, &pstat) == -1) {
    fclose(f);
    return FILE_ERR;
}

if (S_ISDIR(pstat.st_mode)) {
    fclose(f);
    return PATH_IS_DIR;
}
Run Code Online (Sandbox Code Playgroud)

如果不可能,是否有其他解决方案可以防止TOCTOU错误以及错误的权限错误?

c fopen posix stat fstat

5
推荐指数
2
解决办法
427
查看次数

对加密不安全的随机数使用rand()是否可以接受?

是否可以接受使用C标准库的rand()函数,该函数都随机数并不必须加密安全?如果是这样,还有更好的选择吗?如果没有,应该使用什么?

当然,我认为关于偏斜常见警告适用。

c random

3
推荐指数
3
解决办法
158
查看次数

标签 统计

c ×2

fopen ×1

fstat ×1

posix ×1

random ×1

stat ×1