防止目录遍历的关键是禁用“列出文件夹/读取数据”权限,而非仅禁止打开文件;需显式拒绝该权限、关闭继承、逐层收紧,并慎用Everyone组。
要防止普通用户遍历目录,关键不是“禁止打开文件”,而是切断他们“看到里面有什么”的能力。ntfs中控制这一点的核心权限是“遍历文件夹/执行文件”和“列出文件夹/读取数据”——前者决定能否进入下级目录,后者决定能否看到该目录里有哪些文件或子文件夹。
明确禁用“列出文件夹/读取数据”权限
普通用户(如Authenticated Users、Users组,或具体账号)若拥有“列出文件夹/读取数据”权限,就能在资源管理器或命令行中看到目录内容,哪怕不能打开任何文件。要真正阻止遍历,必须显式拒绝或不授予这项权限:
- 右键目标文件夹 → “属性” → “安全”选项卡 → “编辑” → 选中用户或组 → 取消勾选“列出文件夹/读取数据”
- 若需彻底阻断,可点击“高级”→ 添加该用户→ 设置“拒绝”类型,并仅勾选“列出文件夹/读取数据”(拒绝优先级高于允许,效果更可靠)
- 注意:不要直接删掉所有用户,否则管理员也可能被锁在外面;应保留必要账户(如Administrators、SYSTEM)的完全控制权
关闭继承并逐层收紧权限
默认情况下,子文件夹会继承父级权限,容易留下漏洞。比如你只在D:\Data设了限制,但D:\Data\Public却因继承了宽松权限而暴露:
- 进入目标根目录“安全”→ “高级”→ 取消“启用继承”的勾选 → 选择“将继承的权限转换为此对象的显式权限”
- 之后再对每个需保护的子目录单独设置,确保没有意外放行“列出文件夹”
- 特别注意Web服务器场景:IIS匿名用户(如IUSR_主机名)必须在网站根目录有“读取”,但在其他分区(如D:\、E:\)应明确拒绝“遍历”和“列出”
慎用Everyone,优先用最小权限组
Everyone组包含所有登录用户(甚至来宾),一旦赋予它“列出文件夹”权限,等于向所有人开放目录结构:
- 服务器环境建议直接从ACL中删除Everyone,除非有明确兼容需求
- 改用更精确的组,如Users(不含管理员)、Authenticated Users(排除来宾),再配合拒绝策略
- 对敏感路径(如C:\Windows、C:\Program Files),即使不删Everyone,也务必确保其“列出文件夹/读取数据”为“拒绝”或未勾选
命令行快速验证与加固(icacls)
图形界面易漏看继承状态,用命令行可一目了然:
- 查看某目录当前谁有“列出”权限:
icacls "D:\Secret" /t | findstr /i "LIST" - 拒绝普通用户遍历整个D盘:
icacls D:\ /deny "Users:(X,LD)" /t /c(X=执行,LD=List Directory) - 重置子项继承并只保留管理员访问:
icacls "D:\Secure" /inheritance:r /grant Administrators:(F) /t


















