你的网站是不是突然开始“乱跳”?

打开自己网站,结果秒进博彩页?或者点开首页,下一秒就到了完全不认识的境外推广站?用户私信你:“刚点进来就弹窗了”,流量数据断崖式下滑——别怀疑,这大概率不是服务器抽风,是有人悄悄往你网站里塞了跳转代码。

第一步:如何快速确认跳转类型?

先别急着删文件。打开浏览器,按 F12,切到「网络」(Network)标签页,点一下左上角的清空按钮,再刷新页面。

盯紧第一个请求的状态码:

  • 如果是 301302 → 跳转发生在服务器端,问题可能出在 .htaccess、Nginx 配置,或者 PHP 文件里的 header("Location: ...")
  • 如果状态码是 200,但页面加载完立刻跳走 → 基本可以锁定是前端被塞了脚本,比如藏在 footer.php 里的 window.location.href = "xxx",或者一段自动执行的 iframe

一个真实案例:上周帮一个做本地装修的客户排查,他网站 PC 端一切正常,但手机一打开就跳赌博站。我们用 Chrome 的「设备模拟器」切到 iPhone 模式,在 Network 里发现每次请求都返回一个 200 页面,几毫秒后控制台就执行了一段从 cdn-srv[.]top 加载的 JS——这串域名他根本没用过,直接定位到主题 footer 里被硬塞的代码。

第二步:从哪里开始“地毯式搜索”?

恶意代码爱钻空子,但它有固定套路。优先查这几个地方,80% 的问题能在这圈出来:

  1. 主题和插件文件:尤其是你正在用的主题,打开 header.phpfooter.phpfunctions.php,从头到尾快速扫一眼——特别注意文件最开头和最后几行。插件也一样,重点看那些半年没更新、作者名看着像拼音乱码、或者安装包是从第三方论坛下载的。
  2. 数据库内容:进 phpMyAdmin,打开 wp_posts 表,用「搜索」功能查 eval(base64_decodefromCharCode;再切到 wp_options 表,搜 theme_mods_ 开头的 option_name,有些黑链会伪装成主题设置混进去。
  3. 根目录核心文件index.phpwp-config.php.htaccess 这几个文件,用文本编辑器打开,看第一行和最后一行有没有多出来的 <?php ... ?> 块,或者末尾突然多了一行 <script>

第三招:用哪些工具能提高排查效率?

别靠肉眼一行行翻。把网站文件整个下载到本地,用你平时写代码的工具来干这事:

  • VS Code 全局搜索:打开整个网站文件夹,按 Ctrl+Shift+F(Mac 是 Cmd+Shift+F),搜这些关键词:
    <script src=<iframe src=window.locationdocument.write(eval(base64_decode(
    搜出来结果,一个个点开看来源——不是你加的,一律标红。
  • 用 Beyond Compare 对比备份:如果你电脑里还存着上个月的网站压缩包,直接拖两个文件夹进去对比。所有被改过的文件左边标红、右边标绿,一眼就能揪出哪几个文件“被动过手脚”。
  • 翻服务器 access.log:登录宝塔或 cPanel,找到最近 24 小时的访问日志。用记事本打开,搜 .php?POST /wp-admin/,看有没有大量来自同一 IP 的异常 POST 请求——那很可能是黑产在批量上传木马。

第四招:遇到加密混淆的代码怎么办?

看到 eval(base64_decode('aHR0cHM6Ly9...')) 这种,别懵。它只是把真实地址藏起来了,不是什么高深技术。

安全解法

  1. 把单引号里的那一长串字符全选中,复制;
  2. 打开本地浏览器,新建一个空白 HTML 文件,贴进去这段代码:
<script>
console.log(atob('aHR0cHM6Ly9...')); // 把你复制的串粘贴到这里
</script>
  1. 用浏览器打开这个 HTML,F12 看 Console 输出——解出来的就是真实跳转地址。

一个具体例子:在客户主题的 footer.php 最底下,只有一行:<?php eval(base64_decode("ZWNobyAi...")); ?>。我们按上面步骤解出来,发现是往 <head> 里动态注入一个外部 JS,而那个 JS 文件每小时换一次域名,专门用来做移动端跳转。

第五步:清理后如何避免再次中招?

删干净不等于结束。很多站长修完第二天又被黑,就是因为漏了这几步:

  1. 密码全部重置:WordPress 后台、FTP、数据库、宝塔面板、甚至主机商后台——所有带密码的地方,今天必须全换。密码别用“admin123”,试试“煎饼果子加俩蛋不加葱”这种又长又傻又好记的。
  2. 砍掉所有闲置项:进 WordPress 后台,把不用的主题、停用超过 3 个月的插件,全部删掉。连 demo 数据、测试页面也清干净。
  3. 锁死文件权限:在宝塔或 FTP 里,把整个网站目录设为 755,所有 .php 文件设为 644wp-config.php 单独设成 600400——不让任何程序能偷偷改它。
  4. 马上做一次干净备份:用宝塔一键备份,或导出数据库 + 打包网站根目录,存在本地硬盘,别只放网盘。

今天下班前就能执行的操作清单

现在就打开电脑,按顺序做这五件事:

  1. 立刻备份数据库:进主机管理后台或 phpMyAdmin,选中所有数据库,导出为 .sql 文件,保存到桌面,文件名带上今天日期。
  2. 下载整站文件:用 FileZilla 或宝塔文件管理器,把 /www/wwwroot/你的域名/ 整个文件夹打包下载到本地。
  3. 挂维护页:在网站根目录新建一个 maintenance.html,内容就写一行 <h1>网站升级中,稍后再来</h1>;然后在 WordPress 根目录的 index.php 开头加一行 include 'maintenance.html'; exit;(临时用,修完记得删)。
  4. 本地全局搜外链:用 VS Code 打开刚下载的网站文件夹,按 Ctrl+Shift+F,搜 <script src=,重点关注结果里出现的非你域名、非 CDN 域名的链接。
  5. 直击首页文件:双击打开 index.php 和你当前主题的 header.php,鼠标滚轮拉到底部,看最后 10 行有没有 <?php<script>http:// 开头的奇怪代码——有就截图,别动,先来找人一起看。

做完这五步,你已经拦住了扩散,也摸清了大概在哪动手。剩下的,是耐心一点,一行行清理。网站被黑不可怕,可怕的是修完不记教训。下次更新插件前,多点两下「查看最近更新日志」,比啥防护插件都管用。