黑链藏了3个月才发现,收录掉了80%才排查,网站被黑监控花30分钟搭好比事后修1周划算10倍
有个做本地装修的站长,7个城市站每个月能来300多个精准咨询。去年10月他突然发现咨询量腰斩,打开百度搜索资源平台一看,索引量从2.4万条掉到4000多条。查了整整两天才发现,其中一个站的footer里被植入了30多条隐藏链接,指向的全是色情赌博站。更糟的是,百度已经判定这7个站属于"同一主体违规",全部连坐降权。
从被黑到被发现,中间隔了将近3个月。这3个月里黑链一直在往外输出垃圾外链,蜘蛛每抓一次就加深一次负面判定。如果有一套基本的被黑监控,24小时内就能发现异常——修复成本从"全站数据重建+重新养权重"降到了"删代码、改密码、提交死链"。两种情况的代价差了一个数量级。
网站被黑监控,盯住这四件事就够了
| 1 | 页面内容篡改 — 挂黑链、挂马、页面跳转、弹出广告,最常见也最容易被忽略 |
| 2 | 文件变更异常 — 核心文件被修改、新增可疑PHP/JS文件、权限被篡改 |
| 3 | 收录和排名异常 — 索引量骤降、出现垃圾URL被收录、关键词排名断崖下跌 |
| 4 | 安全警告和黑名单 — 浏览器标红、搜索引擎标记"有风险"、域名被加入安全联盟黑名单 |
一、监控不是"装个插件就完了",被黑有6种方式,每种需要的检测手段不一样

很多人觉得"装个Wordfence就高枕无忧了"。但Wordfence的免费版只做恶意软件扫描和基础防火墙,它不会告诉你百度收录是不是异常、不会提醒你页面源代码里多了一段隐藏跳转、也不会检查你的域名有没有被安全联盟拉黑。被黑是一个多维度的事件,不同攻击方式留下的痕迹在不同层面。
先梳理一下网站被黑的6种典型方式,以及每种方式对应的监控手段。这个对照关系是后面选工具的基础。
| 被黑方式 | 典型表现 | 需要什么监控 | 发现难度 |
|---|---|---|---|
| 隐藏黑链注入 | 页面源码底部被插入隐藏div,里面全是菠菜/色情链接 | 页面源码定期比对 + 外链异常检测 | 中等 |
| 恶意跳转注入 | 用户从搜索引擎点进来被302跳转到其他网站,直接访问正常 | UA判断 + 来源referer判断 + 页面行为模拟检测 | 较高 |
| Webshell后门 | 服务器上被上传了一个PHP大马,可以随时执行任意操作 | 文件变更监控 + 异常进程检测 + 可疑文件特征扫描 | 高 |
| 数据库篡改 | 文章内容被批量替换、用户密码被修改、垃圾内容注入 | 数据库定期校验 + 内容hash对比 | 高 |
| DNS/域名劫持 | 域名解析被篡改指向钓鱼站,用户在不知情下访问假站 | DNS记录定期核查 + SSL证书有效性监控 | 中等 |
| CC/DDoS流量攻击 | 服务器CPU跑满、带宽耗尽、网站打不开或响应极慢 | 服务器资源监控 + 访问频率异常告警 | 低 |
6种方式里,有3种的"发现难度"标注为高。Webshell后门和数据库篡改尤其隐蔽——网站看起来完全正常,用户访问没问题,蜘蛛抓取也没报错,但后门已经在那里了。没有主动的文件变更监控,你永远不知道服务器上多了一个文件。
二、三个层面的监控,缺一个就是盲区
把前面的6种被黑方式对应到监控手段,会发现监控需要覆盖三个独立层面。每个层面用的工具、检查频率、发现问题的类型都不一样,少一个就有盲区。
层面一:代码层监控
监控对象:网站文件、数据库内容、核心配置文件
检查内容:文件是否被修改/新增、是否包含恶意代码特征(eval、base64_decode等)、核心文件hash是否变化
频率建议:文件变更实时监控 + 全量扫描每天一次
层面二:表现层监控
监控对象:页面内容、外链、收录状态、搜索快照
检查内容:页面源码中是否有隐藏内容、外链是否异常增长、收录URL中是否有陌生页面、快照是否被劫持
频率建议:每天一次,异常时立即告警
层面三:信誉层监控
监控对象:域名黑名单状态、搜索引擎安全标记、SSL证书
检查内容:是否被百度/谷歌标记为"有风险"、是否被安全联盟/腾讯网址安全中心拉黑、SSL证书是否即将过期或被吊销
频率建议:每天一次,SSL证书到期前30天提醒
常见的监控盲区:很多人装了安全插件就以为覆盖了代码层,但表现层(收录异常、快照劫持)和信誉层(黑名单)完全没人盯。而这两种恰恰是SEO站群最致命的——黑链导致收录暴跌时,安全插件不会发出任何告警,因为它的扫描逻辑里不包含"百度索引量变化"这个指标。
三、5个监控工具逐项跑一遍,能覆盖到什么程度
市面上的安全工具主要分两类:WordPress插件类(装在站点内部,做本地扫描和防火墙)和SaaS云平台类(从外部监控,做远程扫描和黑名单检测)。两类覆盖的层面不一样,用对比表看清楚。
| 工具 | 类型 | 代码层 | 表现层 | 信誉层 | 免费版够用吗 | 付费起步价 |
|---|---|---|---|---|---|---|
| Wordfence | WP插件 | 恶意软件扫描、文件变更检测 | 不支持 | 不支持 | 基础功能够用,实时规则需付费 | $119/年 |
| Sucuri | SaaS平台 | 远程扫描+服务器端扫描 | 页面变化检测 | 黑名单监控 | 仅SiteCheck免费扫描,持续监控需付费 | $199/年 |
| Solid Security | WP插件 | 文件变更检测(免费版无) | 不支持 | 不支持 | 仅基础加固,核心监控要付费 | $99/年 |
| UptimeRobot + 百度站长平台 | 组合方案 | 不支持 | 收录量变化、关键词监控 | 部分(百度安全检测) | 基本够用 | 免费 |
| 自建脚本监控 | 开源方案 | inotify实时文件监控 + hash对比 | 自定义页面抓取比对 | API对接黑名单检测 | 免费,但需要自己写代码 | 服务器成本 |
一个关键发现:没有任何一个单一工具能同时覆盖三个层面。Wordfence代码扫描最强但不管收录异常;百度站长平台能看收录但不会告诉你文件有没有被改;Sucuri覆盖面最广但起步$199/年,10个站一年就是$1990。
对于多站点站群来说还有一个问题:WP安全插件是每个站都要装一份的。15个站装15个Wordfence,光后台通知就能把你淹没。而且付费版按站点收费,15个站×$119 = $1785/年。这个账算下来,自建监控脚本+免费工具组合的性价比优势就非常明显了。
四、30分钟搭一套基础监控,能抓到80%的被黑事件
不需要买Sucuri企业版,也不需要给每个站装付费插件。用一套免费工具+简单脚本的组合,30分钟能搭出覆盖代码层+表现层+信誉层的基础监控。这套方案的核心逻辑是:能覆盖多少种被黑方式比单个工具的精度更重要。宁可多几个误报,也不能漏掉真正的异常。
下面是具体方案,按搭建顺序排列,每个组件解决一个维度的问题。
组件一:Wordfence免费版 — 代码层恶意软件扫描
每个WP站装一个,配置每晚凌晨自动全量扫描。重点开启:恶意软件签名检测、核心文件完整性校验、插件/主题已知漏洞库比对。免费版够用,不需要开实时防火墙(那个要付费)。扫描完成后如果有异常,Wordfence会发邮件。设置一个邮箱过滤器,把Wordfence的告警邮件标红置顶。
组件二:inotify文件变更实时监控 — 代码层文件篡改检测
Wordfence的扫描是定时任务,最短间隔1小时。但Webshell被上传后黑客可能几分钟内就执行了操作。inotify是Linux内核级的文件系统事件监控,能实时感知任何文件的创建、修改、删除。监控网站根目录下的所有.php、.js文件变更,发现新文件创建或核心文件被修改立即发告警。下面会给出配置脚本。
组件三:百度站长平台+百度云观测 — 表现层收录和异常监控
百度搜索资源平台的"索引量"工具可以看到每天的索引变化。设置一个阈值告警逻辑:日索引量下降超过30%即触发排查。同时百度云观测(免费)提供7×24小时网站安全检测,覆盖挂马、黑链、钓鱼、违规内容四类。这两个工具组合基本覆盖了百度生态内的被黑检测。
组件四:UptimeRobot + 自定义页面抓取 — 表现层内容篡改检测
UptimeRobot免费版可以监控50个URL的可用性。但除了"能不能打开",还需要检查"打开后内容对不对"。写一个简单脚本,每天定时抓取首页和内页的HTML源码,和前一天保存的版本做diff对比。如果发现了前一天没有的隐藏链接、iframe、陌生script标签,立即告警。这个脚本5分钟写完,但能抓到Wordfence和百度云观测都抓不到的东西——比如只在特定UA下才触发的跳转代码。
组件五:SSL证书 + DNS记录 + 域名黑名单监控 — 信誉层全覆盖
SSL证书过期或DNS被篡改属于"基础设施级"被黑,影响最严重。用certbot的自动续期+监控脚本确保证书不会过期。DNS记录每天用dig命令对比快照。域名黑名单状态对接百度网址安全中心API和VirusTotal API,每天查询一次。这三个检查加起来不超过50行脚本。
五个组件加起来,月度费用是零(如果服务器已有的话),覆盖了代码层(Wordfence + inotify)、表现层(百度平台 + 页面抓取对比)、信誉层(SSL/DNS/黑名单API)三个维度。搭建时间:Wordfence安装5分钟 + inotify配置10分钟 + 页面抓取脚本5分钟 + 黑名单检查脚本5分钟 + 告警通道配置5分钟 = 30分钟。
五、两个核心脚本,复制就能用

上面五个组件里,Wordfence和百度平台是界面操作,不需要代码。但inotify文件监控和页面内容对比需要脚本。下面给出可以直接用的版本。
脚本一:inotify实时文件变更监控(Linux服务器)
#!/bin/bash# 监控网站目录下所有.php和.js文件的新增和修改# 保存为 /usr/local/bin/web-monitor.shWATCH_DIR="/www/wwwroot/你的网站目录"LOG_FILE="/var/log/web-monitor.log"ALERT_EMAIL="你的邮箱@example.com"# 安装inotify-tools(如果没有的话)# apt install inotify-tools -yinotifywait -m -r \--format '%T %w%f %e' --timefmt '%Y-%m-%d %H:%M:%S' \-e create -e modify -e delete -e moved_to \--exclude '(cache|logs|uploads|tmp)' \"$WATCH_DIR" | while read line; doecho "$line" >> "$LOG_FILE"# 如果是.php文件被创建,立即告警if echo "$line" | grep -qE '\.php.*CREATE'; thenecho "[告警] 新的PHP文件被创建: $line" | \mail -s "[紧急] 网站文件异常 - 新PHP文件" "$ALERT_EMAIL"fi# 如果核心WP文件被修改,告警if echo "$line" | grep -qE '(wp-config|functions|index)\.php.*MODIFY'; thenecho "[告警] 核心文件被修改: $line" | \mail -s "[紧急] 网站核心文件被修改" "$ALERT_EMAIL"fidone把这个脚本用nohup挂到后台运行,或者配成systemd服务开机自启。它会持续监控网站目录,发现新PHP文件创建或核心文件被修改时立刻发邮件。关键点是排除了cache、logs、uploads等正常会有文件变动的目录,避免误报轰炸。
脚本二:页面内容每日对比检测(任意服务器/本地)
#!/usr/bin/env python3# 每天抓一次首页和内页,和昨天的版本做diff# pip install requests beautifulsoup4import requestsimport hashlibimport jsonimport osfrom datetime import datetime, timedeltaSITES = [{"name": "site1", "url": "https://你的网站1.com", "pages": ["/", "/about/", "/contact/"]},{"name": "site2", "url": "https://你的网站2.com", "pages": ["/", "/product/"]},]DATA_DIR = "./page_snapshots"BLACK_KEYWORDS = ["eval(", "base64_decode", "document.write", "window.location","display:none", "visibility:hidden", "position:absolute;left:-9999"]def check_page(name, url):try:headers = {"User-Agent": "Mozilla/5.0 (compatible; Googlebot/2.1)"}r = requests.get(url, headers=headers, timeout=10)content_hash = hashlib.md5(r.text.encode()).hexdigest()# 检查可疑内容alerts = []for kw in BLACK_KEYWORDS:if kw in r.text:alerts.append(f"发现可疑关键词: {kw}")# 加载昨天的快照snap_file = f"{DATA_DIR}/{name}.json"if os.path.exists(snap_file):with open(snap_file) as f:old = json.load(f)if old.get("hash") != content_hash:alerts.append(f"页面内容已变更(hash: {old['hash'][:8]} → {content_hash[:8]})")# 保存今天快照today = datetime.now().strftime("%Y%m%d")with open(snap_file, "w") as f:json.dump({"date": today, "hash": content_hash, "len": len(r.text)}, f)if alerts:print(f"[告警] {name} ({url}):")for a in alerts:print(f" - {a}")except Exception as e:print(f"[错误] {name} ({url}): {e}")if __name__ == "__main__":os.makedirs(DATA_DIR, exist_ok=True)for site in SITES:for page in site["pages"]:full_url = site["url"].rstrip("/") + pagecheck_page(f"{site['name']}{page.replace('/', '_')}", full_url)这个脚本有两个核心检测逻辑:一是可疑关键词匹配——eval、base64_decode、隐藏样式等黑帽代码特征;二是每日内容hash对比——页面内容变了就告警。注意User-Agent设成了Googlebot,这样能抓出只对搜索引擎触发的隐藏内容。
两个脚本的告警通道建议:不要只依赖邮件——如果服务器已经被控,sendmail也可能被禁用。建议多加一条:用企业微信/钉钉/飞书的Webhook机器人发消息。在脚本末尾加一行curl -X POST 你的Webhook地址 -d '{"msg":"告警内容"}'即可,比邮件可靠得多。
六、多站点怎么批量管?一个看板比15个后台高效10倍
前面说的都是单站监控方案。但做站群的都清楚,管理15个站的安全状态和管1个站完全是两个量级。15个站的Wordfence后台、15个百度站长平台账号、15份页面快照、15个SSL证书到期时间——没有一个统一视图的话,漏掉一个站的异常是大概率事件。
多站点监控的核心不是"每个站都装一遍工具",而是把15个站的监控数据汇总到一张看板上。下面是一个可行的低成本方案。
| 监控维度 | 单站方案 | 多站汇总方案 | 实现方式 |
|---|---|---|---|
| 文件变更 | inotify单站脚本 | 所有站目录统一监控,告警带站点名 | 一个inotify脚本监控父目录,日志标站名 |
| 页面内容 | Python单站抓取 | 循环遍历所有站点URL列表 | SITES列表加全站URL,每天跑一遍 |
| 收录状态 | 百度站长平台逐个看 | 百度API批量拉索引量数据 | 百度搜索资源平台API,写脚本批量拉取 |
| SSL/DNS/黑名单 | 手动检查 | 批量dig + openssl + API查询 | 域名列表循环,结果写到一个HTML看板 |
| 安全扫描结果 | Wordfence逐个后台看 | Wordfence邮件汇总 + 规则过滤 | 邮件过滤器自动归类,只留告警邮件 |
汇总之后,把这些数据输出到一个简单的HTML看板页面。不需要什么花哨的仪表盘框架,一个Python脚本生成一个静态HTML文件,每天更新一次。看板上每个站点一行,每列一个监控指标(文件变更状态、页面hash、索引量变化、SSL到期天数、黑名单状态),正常绿色、异常红色。
系统化方案:对于站群规模较大(15个站以上)的情况,UC建站系统的多站安全看板是一个更省事的方案。它把索引量监控、收录异常告警、SSL证书到期提醒、安全扫描结果汇总到一个统一后台,不用自己写脚本整合。双通道推送(百度API + IndexNow)也能确保清理完黑链后的正常页面快速被重新抓取。独立部署架构下,一个站被黑不会连累其他站点。
七、真被黑了怎么办?从发现到恢复的标准流程
监控系统告警了,确认网站确实被黑了。这时候最忌讳两件事:一是慌慌张张直接删文件(可能删了正常文件留了后门),二是先去找"是谁干的"(溯源可以后面做,止损是第一优先级)。下面是从告警触发到完全恢复的标准操作流程。
第1步:立即隔离(5分钟内)
· 服务器面板暂停站点或设置503维护页
· 关闭FTP/SSH之外的所有外部访问
· 不要关机!保留内存中的进程信息
· 立即改FTP、数据库、后台管理员密码
第2步:完整备份取证(10分钟)
· 打包当前全部文件(包括被黑状态)
· 导出完整数据库
· 保存最近的访问日志和错误日志
· 这些是后续分析和申诉的证据
第3步:定位并清除(核心步骤)
· 用Wordfence全量扫描找恶意文件
· find查最近24h修改的文件
· grep搜eval、base64_decode、shell_exec
· 检查.htaccess、wp-config.php是否被篡改
第4步:恢复上线 + 百度申诉
· 恢复干净的备份或手动清理后重新部署
· 百度搜索资源平台提交死链(垃圾URL)
· 提交主动推送加速正常页面重新收录
· 百度网址安全中心提交安全申诉
注意:百度安全申诉的审核周期一般是2个工作日,但收录恢复要慢得多——从清理完成到索引量回到正常水平,通常需要2周到2个月不等。这就是为什么前面反复强调"监控比修复重要"——提前发现意味着收录还没掉太多,恢复周期从2个月压缩到2周。
八、不同规模下的监控方案选择
最后用一张表来收尾。根据站点数量和预算,选不同的监控方案组合。核心逻辑不变——代码层+表现层+信誉层三层都要覆盖,但实现方式可以根据规模调整。
| 站点规模 | 代码层方案 | 表现层方案 | 信誉层方案 | 月成本 |
|---|---|---|---|---|
| 1-3个站 | Wordfence免费版 + inotify脚本 | 百度站长平台 + Python页面抓取 | SSL脚本 + VirusTotal API | 0元 |
| 4-10个站 | Wordfence免费版 + 统一inotify监控 | 百度站长平台 + 批量页面抓取 + 汇总看板 | 批量SSL/DNS检查 + 黑名单API | 0元 |
| 11-30个站 | Wordfence免费版 + 自建监控看板 | 百度API批量拉取 + 自动化告警 | 自动化脚本 + Webhook告警 | 0元 |
| 30个站以上 | UC建站系统多站安全看板 + 统一监控 | 系统内置索引量/收录异常告警 | 系统内置SSL/黑名单/证书管理 | 系统成本 |
30个站以下,免费方案完全够用。关键不是花了多少钱,而是有没有把三个层面的监控都搭起来。前面那个装修站长的案例,如果当时有一层最简单的页面内容每日对比,黑链撑不过24小时。
最后说一句
网站被黑这件事,不怕被黑,怕的是被黑了不知道。只要监控搭到位,从被黑到发现的时间窗口从"几个月"压缩到"几小时",修复成本就是千倍级的差距。花30分钟把上面五个组件搭起来,比等出了问题再修一周划算得多。
