不少站点被拖走数据、被搜索引擎索引到不该出现的页面,起点并不是什么高明的攻击,而是一个地址:把它敲进浏览器,文件就下载下来了。这类问题通常发生在开发、改版、迁移的过程中,做完之后没人回头清理,于是备份包、配置文件和测试脚本就一直躺在网站根目录下面。
先看常见暴露清单
自查可以从下面这些路径开始,它们出现的概率远高于想象:
- 版本控制目录:.git、.svn、.hg,一旦可访问,源码历史基本等于公开。
- 备份压缩包:backup.zip、www.rar、站点名_20240101.tar.gz,以及各种带日期的命名。
- 配置文件与它的副本:.env、config.php.bak、database.php.old。
- 编辑器残留:.index.php.swp、index.php~、index.php.save。
- 数据导出文件:data.sql、users.csv、导出.xlsx。
- 日志与调试文件:error.log、access.log、phpinfo.php、test.php。
- 目录本身可列文件:上传目录、附件目录访问后直接出现一长串文件名。
- 系统生成的小文件:.DS_Store、Thumbs.db,容易暴露目录结构。
怎么查,怎么改
先从状态码看起
逐个猜测路径虽然笨,但有效。可以直接在浏览器里试,也可以用命令行看响应头:curl -I https://example.com/backup.zip。重点看两件事:状态码是不是 200,内容类型是不是压缩包或文本。目录则看是否返回了文件列表页。
关掉目录索引
Nginx 里确认 autoindex off;;Apache 里确认对应目录没有 Options Indexes。很多老站点是因为迁移时复制了默认配置,把目录列表一起带过来了。关掉索引之后,目录会返回 403,但里面的具体文件仍然可能被直接访问,所以还需要单独处理敏感文件。
敏感路径建议直接返回 404
对备份包、.git、.env 这类路径,返回 404 比返回 403 更省心:403 相当于告诉对方“这里有东西,只是不给你看”,404 则让路径看起来不存在。无论选哪种,都不要返回 200 的空页面,那会让普通访客和蜘蛛都以为访问成功。
别让 robots.txt 变成指路牌
一个常见误区是把敏感文件名写进 robots.txt 的 Disallow 里。这样做等于公开告诉所有人:这里有个叫 backup.zip 的文件。robots.txt 是给守规矩的爬虫看的建议,不是访问控制,它既拦不住手动访问,也拦不住不遵守协议的采集程序。
robots.txt 是请求,不是权限。真正的门锁应该配在服务器上,而不是写在一份公开可读的文本里。
这件事和蜘蛛抓取的关系
搜索引擎的蜘蛛在抓取时同样会尝试这些常见路径,有些还会顺着页面上残留的测试链接、附件地址一路爬过去。结果是两方面的浪费:一方面抓取预算被这些低价值地址消耗掉,真正需要更新的内容反而排到后面;另一方面,如果某个敏感地址已经被返回 200 并被索引,用户搜一下就能看到。
已经暴露过的地址建议这样处理:先在服务器层面拒绝访问,让它返回 404 或 410;再确认页面和 sitemap 里没有指向它的链接;如果已经被收录,可以在搜索资源平台提交移除请求,同时依靠重新抓取逐步更新索引状态。
上线前检查清单
- 确认网站根目录及子目录下没有压缩包、SQL、CSV 等导出文件。
- 确认 .git、.svn 等目录已删除或已被服务器规则拦截。
- 检查配置文件及其 .bak、.old 副本是否可访问。
- 清理解压后遗留的安装目录、测试页面、示例文件。
- 确认目录索引已关闭,上传目录访问不出现文件列表。
- 检查 robots.txt 中是否泄露了具体文件名或内部目录。
- 把这几项加入日常巡检,尤其在改版、迁移、换服务器之后复查一次。
这类自查花不了多少时间,但能把一个非常直接的风险挡在门外。对站点运营来说,它同时保护了两件事:访客看到的内容边界,以及蜘蛛愿意花在有效页面上的抓取额度。