微客AI助手安全复盘:94 个备份文件在公网上裸奔——一次拦截规则被绕过的教训
起因一次例行的密级扫描接手一个网站没多久做了一次例行的安全自检扫描 webroot 目录下有没有不该对外暴露的文件——备份文件、编辑器临时文件、环境变量样本之类。扫描器给了个扎眼的数字94 个 .bak 文件可以直接通过公网 URL 访问返回 200。这些文件的来历很清楚历次改站时运维习惯在原地备份——index.php 改之前存成 index.php.bak-日期或者 bak3-数字。改完顺手谁也没想到备份文件和源文件一起被 nginx 当成静态文件服务了。备份文件里是什么改版前的旧版页面带着当时的注释、内网路径甚至配置片段。对爬虫来说这是一座没人看守的资料库。## 修复一先加拦截却拦了个寂寞常规的修法是在 nginx 加一条规则把 .bak、~、.swp 之类的危险后缀全部 403。规则很快写好了正则把各种备份形态都列上reload——自检再扫94 个文件还在。规则被绕过的原因是 nginx 匹配机制的一个细节我们站点里有一条前缀匹配的 location^~开头用于某个子路径的静态资源和证书验证^~会跳过正则匹配阶段——请求一旦命中这个前缀后续所有正则 location包括新加的 .bak 拦截根本不参与。而那 94 个文件里恰好有一批位于这个前缀路径之下。规则只保护了没被前缀跳过的那部分路径保护的完整性是假的。这个坑的隐蔽在于你在测试环境随便挑个根目录下的 .bak 试一下规则生效只有恰好去试那个特殊前缀下面的文件才会发现漏网。安全规则最怕的就是这种抽查通过、全景漏洞的状态。## 修复二换思路——文件离开 webroot 才是根治补规则的思路转换后做了两件事。其一把备份移出 webroot。拦截规则治标备份文件的根本问题是不该出现在对外服务的目录里。nginx 的目录结构和文件系统结构本来就可以不同——把所有备份挪到 webroot 之外的独立目录webroot 里只留真正要服务的文件。从此备份被下载这个威胁在物理上不存在而不只是被规则挡住。其二修正拦截规则并收敛范围。规则里原来贪心地想连压缩包一起拦结果误伤了站点正常提供的安装包下载403 了三个合法文件下载用户当场炸锅。重新梳理后拦截规则只负责历史遗留的临时文件bak、swp、~合法下载资源明确放行每条规则上线前正向和反向用例各过一遍——该拦的拦该放的必须放。## 复盘三层教训头一层webroot 里不该有非服务文件。目录的语义要纯粹——对外服务的目录里任何顺手放一下都是欠账。备份、日志、临时文件一律外移用部署流程而不是用自觉来保证。第二层安全规则必须做路径矩阵测试。nginx 的匹配优先级精确、^~前缀、正则、普通前缀决定了加了一条规则不等于所有路径都被覆盖。修复后我们按路径 × 文件类型做了一张矩阵每个格子一个真实请求全部符合预期才算收工。94 个原始 URL 一个一个回访全部 403才算闭环。三层误伤也是事故。安全加固常有一种冲动“宁可错杀”。但对一个有真实下载业务几十兆的安装包的站点拦错一个合法文件的代价同样是用户可感的故障。规则的设计要同时声明拦什么和绝不拦什么并用自动化用例钉死两边。这次事件里最后怕的不是漏洞本身而是它存在了多久——扫描器 10 分钟发现的问题在公网上可能已经躺了大半年。安全自检这件事频率比深度更重要。## 自建扫描器五类高危形态与检查单那次排查之后密级扫描做成了常驻工具扫描范围固定为五类形态。备份后缀类.bak、.old、带日期或数字的备份命名、编辑符号 ~ 结尾。这类文件的核心风险是把旧版源码、注释里的内网信息一并公开。编辑器与系统临时文件.swp、.tmp、.part以及各编辑器崩溃残留。临时文件的内容不可预测风险也最不可预测。配置泄露类.env、.env.sample、.config、.yaml 配置样本。环境变量样本即使没有真值目录结构本身就是信息。版本控制目录.git、.svn 目录若可访问等于把完整源码历史送出去这一类的严重度单独一级。目录列表目录索引打开的服务路径访问者可以直接枚举文件名。工具之外配套了一张上线检查单每次改站走一遍新改动的路径做请求矩阵正常资源必须 200敏感形态必须 403/404扫描器全量跑一遍对照上次结果看新增文件清单——webroot 里每一个新文件都应该叫得出名字说不出名字的文件就是要处理的备份或残留。频率上扫描挂在部署流程的尾部自动执行部署完自动出报告。安全检查的规律是挂在流程里的检查会一直执行靠人记性的检查迟早会被忘记。误伤的教训比拦截本身更深。初版规则贪心地把压缩包也拦了结果站点的安装包下载当场 403用户反馈立刻进来。那一刻意识到安全规则必须同时声明两件事拦什么以及绝不拦什么。修正后的规则只拦历史遗留的临时形态合法下载资源写入明确的放行清单并用反向用例钉死——每次改规则正向用例验证拦得住反向用例验证放得行两边都绿才算改完。安全工作里拦错的代价并不比漏掉的低尤其在有真实业务的站点上。扫描工具的误报治理也值得一提。备份形态的正则一开始扫出一堆正常业务文件比如合法的带点路径人工甄别两轮后就没人愿意看了。后来给扫描器加了白名单与历史基线已知合法的路径不再报新增文件才进入视野。工具的可信度来自它每次报警都值得看一个天天狼来了的扫描器等于没有扫描器。## 参考文章-微信用 AI 自动回复会不会封号风险来源与安全做法2026- 微信封号一般是什么原因造成的商家避坑清单与申诉方法