在 CentOS(以及一般 Linux 系统)里,readdir 本身不是“绝对安全”或“绝对不安全”的概念,要看使用场景、调用方式、权限和代码实现。下面分几点说清楚。
readdir 是什么readdir 是 POSIX / glibc 提供的目录读取函数:
struct dirent *readdir(DIR *dirp);
常见配套:
opendir()readdir()closedir()它用于遍历目录中的文件项。
readdir 本身是否“安全”readdir 不会解析符号链接,但你的程序如果:
open() / stat()就可能被符号链接攻击(symlink attack)。
✅ 正确做法:
fstatat() + O_NOFOLLOWlstat() 判断文件类型如果:
sprintf(path, "%s/%s", dir, ent->d_name);
且 d_name 来自不可信目录,就可能出问题(虽然 readdir 本身不会返回 ../,但组合使用时不安全)。
✅ 建议:
openat() + 目录 fd典型问题:
readdir() 看到文件open()✅ 缓解:
openat()d_name 不是无限长(依赖实现)/proc、/sys)内容动态变化⚠️ 注意:
/proc 可能遇到权限拒绝✅ 安全做法
opendir + fd 方式❌ 不安全做法
你可以告诉我:
readdir?我可以给你具体的安全代码示例。