网站挂马检测按页面拆分问题,核心不是先找“哪个页面被黑”,而是先判断异常是单页独有、模板共有,还是全站注入。把页面分成独立页面、共用模板页、动态参数页三类,分别取原始HTML对比,才能定位挂马注入点。常见误解是:看到某页被跳转或出现异常脚本,就认为该页文件被改;实际上多数挂马来自公共头部、底部、数据库或缓存,单页只是最先被访问到的出口。
挂马检测中,页面呈现异常只是结果,不一定是原因。一段恶意脚本可能被写进公共模板,于是所有引用该模板的页面都中招;也可能只写进某条文章内容,只有该文章页触发;还可能由URL参数、User-Agent或Referer条件触发,普通访问看不到,特定来源才出现。若只按“哪个页面显示异常”去清理,容易清掉表面输出,留下源头。
判断依据应放在证据链上:同一模板下多个页面是否同时异常、异常代码是否出现在服务器返回的原始HTML中、是否只在浏览器执行后出现、是否与站内统计或第三方估算流量口径冲突。第三方估算流量、搜索引擎报告与站内统计口径不同,不能单靠流量下跌反推挂马位置。
第一类是独立页面,例如单篇内容页、单条产品页。检查时直接请求该页URL,查看服务器返回的原始HTML,确认恶意代码是否在源文件或数据库输出中。若只有这一页异常,优先查该页正文、自定义字段、评论、附件描述等可编辑内容。
第二类是共用模板页,例如列表页、详情页、首页。若多个不同URL出现相同异常片段,应对比它们共用的头部、底部、侧栏、统计代码或公共JS文件。此时单页清理无效,必须回到模板和公共资源。
第三类是动态参数页,例如带查询参数的搜索页、带跟踪参数的落地页。此类页面可能因参数拼接、缓存键设计或条件判断而触发挂马。检查时固定路径、替换参数、清空Cookie分别请求,比较返回差异。若只有带某参数时出现异常,问题在参数处理或缓存逻辑,不在静态页面文件。
curl或浏览器查看源代码获取原始HTML,保存为A。适用条件是:你能拿到服务器原始响应,并能区分浏览器渲染后新增的内容。若异常只在浏览器执行后出现,原始HTML干净,则应查前端加载的第三方脚本、浏览器扩展或本地网络环境,不能直接判定服务器被挂马。
方案一:按单页清理。适用于只有独立页面异常、公共模板和公共资源均未发现相同片段、且该页内容可追溯到具体编辑记录。处理方式是删除该页中的恶意内容并复查同作者、同栏目的其他页面。判断结果是:清理后该页恢复,其他页面未再出现相同片段。
方案二:按公共层修复。适用于多个页面出现相同异常片段,或异常出现在公共头部、底部、公共JS、缓存文件中。处理方式是定位并修复公共模板或公共资源,再批量复查引用该公共层的页面。判断结果是:修复公共层后,多个异常页面同时恢复,且新请求不再返回该片段。
若两种方案都试过仍反复出现,应检查写入权限、计划任务、数据库账户和缓存刷新机制,而不是继续按页面删除。此时问题可能不在页面层,而在持久化写入或自动恢复机制。
先取一个异常页面和一个同模板正常页面的原始HTML做对比,标出差异片段出现的区域。若差异只在正文区,按单页清理;若差异在公共区或多个页面重复出现,按公共层修复。把这次对比结果作为后续复查的基准,再决定是否需要检查数据库、缓存和写入权限。