目录浏览为什么会出问题
Web 服务器可能默认开启目录列表:当请求的路径下没有默认首页时,服务器会把目录内文件名逐条列出来。这会泄露文件结构、备份文件、未链接但可访问的资源,甚至让人直接下载到不该公开的文档。上线前应按目录确认关闭,静态资源目录尤其要做最小化控制。
基本信息
| Nginx 控制项 | autoindex off |
|---|---|
| Apache 控制项 | Options -Indexes |
| IIS 控制项 | 目录浏览功能关闭 |
| 检查方式 | 请求以斜杠结尾的目录地址,确认返回 403 或 404 |
| 适用范围 | 静态站、反代站、上传目录、备份目录 |
典型使用场景
- 新站上线:确认静态资源目录没有开启目录索引
- 反代站点:location 块内显式关闭,避免继承意外默认值
- 上传目录:用户上传目录禁止列目录,同时禁止脚本执行
- 备份与临时目录:确认不在 Web 根目录内,或至少不可列目录
- 例行巡检:请求目录地址并核对响应码,纳入上线检查清单
Nginx 关闭目录列表
Nginx 关闭目录列表
location /static/ {
autoindex off; # 关闭目录索引
add_header X-Content-Type-Options nosniff always;
}
location /uploads/ {
autoindex off;
location ~ \.(php|jsp|asp)$ { deny all; } # 上传目录禁止脚本执行
}Apache 关闭目录列表
Apache 关闭目录列表
<Directory /var/www/html>
Options -Indexes # 关闭目录索引
AllowOverride None
</Directory>
# 全局兜底:Options -Indexes -FollowSymLinks 按需选择服务器与控制项
| 服务器 | 控制项 | 验证方式 |
|---|---|---|
| Nginx | autoindex off | curl 目录地址应返回 403/404 |
| Apache | Options -Indexes | 请求目录应返回 403 |
| IIS | 目录浏览功能 | 功能视图中确认已关闭 |
| 对象存储 | 列表权限 | 匿名列举应被拒绝 |
上线检查时直接请求目录 URL(以斜杠结尾),确认返回 403 或 404 而不是索引页;只检查根目录不够,各子目录与 location 块都要覆盖。
对象存储的桶列表权限常被忽略:桶策略允许匿名列举时,效果与开启目录浏览相同,甚至更严重,因为会直接列出全部对象名。
返回 403 与返回 404 传递的信息并不相同:403 说明目录存在但被拒绝访问,404 则连存在性都隐藏了;对不适合对外暴露的目录,用 404 更稳妥。
巡检命令
- curl -sI 站点地址/static/ 观察状态码,403 或 404 为通过
- 对上传、备份、下载等目录逐个请求,而不是只测根路径
- 把检查项写进上线清单,由发布流程统一执行