按页面拆分木马问题的核心做法是:不要先问“整站有没有木马”,而是把每个URL当成独立样本,分别记录它的HTTP响应、HTML源码、外链脚本和服务器文件指纹,再对比哪些页面出现异常、哪些页面正常。异常只集中在少数页面时,优先查这些页面的模板、数据库字段和上传目录;异常覆盖全站页面时,优先查公共头部、底部、伪静态规则和服务器配置。
拆分前要选一种粒度。按URL拆分适合页面数量不多、异常页面能用浏览器直接打开的情况;按模板拆分适合全站页面都带同一段可疑代码的情况。判断方法是:随机打开三个不同类型的页面,比如首页、栏目页、内容页,如果三者都出现同一段陌生脚本,问题更可能在公共模板或服务器层;如果只有内容页出现,问题更可能在内容数据或详情页模板。
两种粒度的适用条件不同。按URL拆分能精确定位受影响范围,但工作量大;按模板拆分速度快,但可能漏掉只污染单条数据的页面。实际处理时可以先按模板缩小范围,再按URL逐条确认。
Content-Type。如果正常页面返回200而异常页面返回302到陌生地址,说明问题可能出在页面入口或重定向规则,而不是正文内容。<script>标签,逐个核对域名是否属于本站或已知第三方。出现无法解释的远程脚本,说明该页面可能被插入了外链代码;如果所有页面都有同一脚本,优先检查公共模板。<div>,说明页面可能被注入了隐藏内容,常见于数据库字段或模板被篡改。第一种方案是“按页面清理”:只处理已确认异常的页面,替换被篡改的模板、删除数据库中的恶意字段、清除相关缓存。它适合异常范围小、能明确列出受影响URL的情况,优点是改动少、恢复快,缺点是没有处理可能的共同入口,容易再次出现。
第二种方案是“按入口封堵”:在清理页面的同时,检查上传接口、后台登录、模板编辑权限、服务器定时任务和第三方组件版本,修复被利用的入口。它适合异常反复出现、多个页面同时中招的情况,优点是能降低复发概率,缺点是工作量大,需要具备服务器和程序层面的排查能力。
判断选哪种方案,可以看两个条件:异常页面是否集中在同一模板或同一目录;清理后短时间内是否再次出现。如果两个答案都是“是”,应优先按入口封堵处理;如果异常只出现在个别页面且清理后不再出现,可以先按页面清理并持续观察。
验证时不要只看首页。应重新请求之前确认异常的每个URL,检查状态码、源码中的外链脚本、隐藏内容和数据库字段是否恢复正常。同时对比一个原本正常的页面,确认清理操作没有破坏正常功能。如果使用第三方检测工具,注意它给出的结果和站内实际文件可能口径不同,最终应以服务器文件和数据库中的实际内容为准。
下一步是建立一份页面清单,记录每个URL的检查时间、异常类型、处理动作和复查结果。这样再次出现类似问题时,可以快速判断是同一入口未封堵,还是新的页面被单独篡改。