很多站点的暴露不是被攻破,而是自己把文件摆在了公开目录里。备份包、编辑器临时文件、版本控制目录、数据库导出脚本,只要放在网站根目录下,任何人访问对应 URL 都能直接下载。日常巡检时,把文件权限与目录列表当成固定动作,能省掉不少后患。
先弄清常见的暴露来源
大部分意外暴露都来自几类固定文件,可以在巡检时按类别过一遍:
- 整站或数据库备份:www.zip、site.tar.gz、db.sql、带日期的备份包。
- 编辑器与系统临时文件:.index.php.swp、style.css.bak、以 ~ 结尾的文件。
- 版本控制与部署残留:.git/、.svn/、.env、部署脚本里带的示例配置。
- 调试页面:info.php、test.php、phpinfo 输出页。
- 服务器目录列表本身:目录里没有默认首页时,服务器把文件清单直接列出来。
自查一:访问目录,看它会不会列出文件
挑几个没有默认首页的目录,直接访问目录地址,例如 /uploads/、/backup/、/static/,观察返回内容。如果看到文件清单,说明目录索引开着。
怎么关
- Nginx:确认没有开启 autoindex on,默认即为关闭。
- Apache:在对应目录配置中去掉 Indexes,写作 Options -Indexes。
- 兜底做法:在没有默认首页的目录放一个空的 index.html。
关掉之后重新访问一次,确认返回的是 403 或 404,而不是 200 加一串文件名。
自查二:把可疑路径挨个敲一遍
这一步不需要工具,浏览器地址栏就够,重点是把常见的文件名试一遍:
- 在网站根目录地址后依次加上 /backup.zip、/www.zip、/db.sql、/.git/config、/.env,看是否直接返回文件内容。
- 返回 200 且有内容,就要立刻处理:要么删掉,要么移到网站根目录之外。
- 如果这些路径曾被搜索引擎抓取过,删除后还应观察一段时间日志,确认没有继续被请求。
需要注意,这类检查只适用于自己管理的站点,批量扫描别人的站点既不礼貌,也可能触碰法律边界。
自查三:文件权限与目录归属
权限设得过松,等于给上传目录开了后门;设得过紧,又会出现图片不显示、程序无法写入的问题。常见的安全基线是:
- 目录 755,文件 644,不要图省事设成 777。
- 数据库配置文件、私钥文件放在网站根目录之外,只允许运行用户读取。
- 上传目录、缓存目录单独划分,并禁止执行脚本,只允许读取静态文件。
- 运行网站的用户与拥有网站目录的用户分开,减少被写入后直接执行的机会。
自查四:把清理做成流程
靠人记得住并不现实,更稳妥的做法是把它写进固定流程:
- 打包备份统一放到站点目录之外,需要下载时通过单独入口获取。
- 部署脚本最后加一步清理:删除 .git、.svn、临时文件与测试页。
- 上线检查清单里加三条:能不能列目录、可疑路径能不能下载、权限是否合规。
- 每月做一次全量巡检,平时以上线后抽样为主。
服务器上的公开目录,就像没有上锁的抽屉。里面的东西未必重要,但被路过的人随手拉开看一眼,总归不是好事。
巡检节奏建议
- 每周:翻一次访问日志里的 404 高频路径,出现大量陌生路径请求时留个心。
- 每月:按上面四步走一遍,重点看新增了哪些备份和临时文件。
- 每次上线后:抽查目录列表与常见敏感路径,确认新增内容没有留下口子。
这些检查花不了多少时间,但能避免某天突然发现数据库备份在网上挂着这类麻烦。