服务器上被遗忘的备份文件,任何人都能下载
网站目录里的 backup.zip、.sql 导出文件和 old/ 文件夹,是机器人最容易得手的目标。怎么检查,该向开发者提什么要求,备份应该放在哪里。
有备份是好事。问题出在备份放错了地方。
常见的经过是这样的。开发者把你的网站迁到新的主机商,或者做一次较大的改动。为保险起见,他把整个网站打包成 backup.zip,把数据库导出为 database.sql,两个文件都放在网站目录里,用起来方便。活干完了,网站正常运行,文件却留了下来。一年后没有人记得它们还在。
可网站目录是公开的。里面的任何文件,只要知道地址,或者猜得到地址,任何人用普通浏览器就能下载。
通常会留下什么
最常见的有这些:
- 整站压缩包,例如
backup.zip、site.tar.gz、www-2023.zip, - 数据库导出文件:
dump.sql、database.sql、db_backup.sql, - 配置文件的副本:
wp-config.php.bak、wp-config.php.old、config.php~, - 放在
old/、test/、backup/这类文件夹里的整套旧版网站, - 网站迁移插件留下的压缩包和安装文件。
最危险的往往是最小的那个:配置文件的副本。服务器会把原来的 wp-config.php 当作程序来执行,所以外面的人读不到里面的内容。但在服务器眼里,wp-config.php.bak 只是一个文本文件,它会原样交出去,包括数据库名、用户名和密码。
数据库导出文件则包含你的网店或表单收集到的一切:姓名、地址、电话、订单记录、用户账户。而 old/ 文件夹里常常有一份多年前的完整网站,能正常运行,插件却没人更新。你的主站维护得再好,也可能从旁边这个被遗忘的副本被攻破。
机器人为什么会来找
没有人需要知道你的服务器上有备份。自动扫描程序在互联网上到处游走,每到一个网站,就把一份常见文件名清单挨个试一遍:/backup.zip、/site.zip、/dump.sql、/wp-config.php.bak、/.env。成本低,速度快,所以它们一直在做。
如果你向主机商要网站的访问日志,几乎肯定能看到这些尝试。在整洁的网站上,每一次都以 404 结束,也就是文件不存在。在留有备份的网站上,其中一次会以 200 结束,并开始下载。
第二条路是搜索引擎。如果开启了目录列表,访问 yourdomain.com/backup/ 会看到一份以 “Index of /backup” 为标题的纯文件清单。这类页面有时会出现在搜索结果里,这样别人连猜都不用猜,直接就能找到。
不需要服务器权限,你自己能查什么
有几件事五分钟就能做完:
- 在 Google 搜索
site:yourdomain.com intitle:"index of"。没有结果是好迹象。 - 在浏览器里输入几个地址,例如
yourdomain.com/backup.zip、yourdomain.com/database.sql或yourdomain.com/old/。如果开始下载,或者看到的是文件列表而不是错误页面,答案就有了。 - 用 ShieldWave 这样的扫描工具检测网站,它会从外部尝试机器人用的那些常见文件名。区别在于,结果是发给你的。
不过靠猜只能猜到一部分。可能的文件名有几百种,开发者也可能给文件起了任何名字。唯一可靠的答案,来自直接查看服务器上文件的人。
怎么请开发者或主机商来检查
你不需要懂技术细节。一条简短的消息,提出四点要求就够了:
- 检查公开的网站目录(通常叫
public_html、www或httpdocs)里没有.zip、.tar.gz、.sql、.bak、.old文件,也没有old、backup、test这类文件夹, - 发现的文件要么移到公开目录之外,要么删除,
- 如果目录列表是开着的,把它关掉,
- 翻一遍服务器日志,看有没有人下载过这些文件。
最后一点很重要。如果有人下载了配置文件的副本,只删掉文件是不够的。必须更换数据库密码,因为对方可能已经把它记下来了。
如果被下载的文件里有客户数据,那就是个人数据泄露。按《通用数据保护条例》(GDPR)第 33 条,你要在得知后 72 小时内向数据保护机构报告,除非这次泄露不太可能给相关人员带来风险。在英国,这个机构是 ICO。即使不需要报告,你也应当留下记录。
备份应该放在哪里
一份好的备份满足几个简单条件:
- 放在公开网站目录之外,最好放在另一台服务器或单独的存储服务上,
- 按计划自动运行,而不是等有人想起来才做,
- 保留好几个旧版本,因为感染往往几周后才被发现,
- 至少有人试过一次用它恢复网站。
使用 WordPress 备份插件时要留意。有些插件默认把压缩包存在网站目录里,比如 wp-content 下的某个位置,再用 .htaccess 文件来保护。这种保护在 Apache 和 LiteSpeed 服务器上有效,但 nginx 服务器根本不读这个文件。最简单的办法是把插件设置成把备份发到别处,不在本地保留副本。
系统管理员常说 3-2-1 原则:三份数据,存在两种不同的介质上,其中一份放在异地。小企业网站可以用简化版:主机商做的备份,加一份自动发送到别处的副本。只是千万不要放进任何人用浏览器就能打开的文件夹。
如果只能向负责你网站的人问一个问题,就问这个:我们的备份在哪里,除了我们,还有谁能下载?