opendir() 本身是 安全的,但“是否安全”要看你怎么用、在哪种场景下用。下面分情况说明:
opendir() 是什么?opendir() 是 POSIX 标准 API,用于打开一个目录流,常用于遍历目录:
DIR *dir = opendir("/some/path");
它在 Linux / Ubuntu / 所有 Unix-like 系统 上都是标准、正统的接口。
✅ 这是推荐做法
opendir(user_input);
❌ 危险点:
../../etc/shadow✅ 正确做法:
realpath() 规范化路径ln -s /etc/passwd trap
opendir("trap")
⚠️ 如果程序假设“目录就是目录”,可能被诱导访问敏感路径。
✅ 建议:
lstat() 判断是否是真实目录opendir() 返回 NULLerrno 中✅ 一定要检查返回值:
DIR *dir = opendir(path);
if (!dir) {
perror("opendir");
}
DIR *dir = opendir(path);
// 忘记 closedir(dir);
❌ 会造成 fd 泄漏
✅ 一定要:
closedir(dir);
opendir() 和后续操作之间/tmp)✅ 对策:
/tmp 等共享目录open() + fdopendir()(更安全)int fd = open(path, O_RDONLY | O_DIRECTORY);
DIR *dir = fdopendir(fd);
opendir() 行为由 glibc + kernel 决定✅
opendir()本身是安全、标准、可靠的
❌ 不安全的是:路径不可信、未校验权限、资源未释放、符号链接滥用
如果你愿意,可以告诉我:
我可以帮你做一个 安全示例 或 安全审计清单。