菠菜链接、色情导航、盗版影视站,网站被挂暗链降权了自己都不知道,后台也看不出来
朋友做医疗站群,三个老域名养了两年,日均IP加起来五六千。上个月发现百度索引量开始断崖式下跌,从三万多条掉到八千条。查了半个月——服务器正常、内容没动、外链没买,直到在其中一个站的footer.php里翻出了两行代码:一段被注释掉的PHP,用base64编码后拼了一个a标签,href指向一个色情导航站,display:none。
暗链是网站安全里最隐蔽的问题之一。用户看不见、页面正常显示、后台看不出任何异常,只有打开源代码才会发现:你的网站已经在给别人打工了。更麻烦的是,如果手里管着几十上百个站,逐个手动排查根本不现实。
暗链的三种来源和危害层级
| 1 | 被入侵植入——网站存在漏洞(弱密码、插件漏洞、文件上传漏洞),攻击者拿到权限后直接修改源码或数据库,插入暗链。这是最常见的情况,wordpress、dedecms等开源CMS是重灾区。 |
| 2 | 买来的模板/插件自带——从非官方渠道下载的WordPress主题、插件,很多被预埋了暗链代码。甚至一些"破解版"商业主题,看似免费,实际上在footer里给你塞了十几个暗链。 |
| 3 | 共享服务器被牵连——同一台服务器上的其他网站被黑后,攻击者通过跨站目录遍历或权限提升,修改同服务器上其他网站的源码。虚拟主机用户尤其容易中招。 |
暗链的危害不只是给别人做嫁衣。百度明确将暗链列为作弊行为,一旦检测到,轻则降权、重则直接清空索引。Google同样把隐蔽链接归类为违反站长指南的黑帽手法,触发人工处罚后恢复周期长达3-6个月。
一、暗链到底怎么藏进你网站的,五种最常见的隐藏手法
动手排查之前,得先知道敌人在哪。暗链的隐藏方式这几年进化了很多,早期就是简单的display:none,现在花样多到不看代码根本猜不到。
| 隐藏方式 | 代码示例 | 典型藏身位置 | 肉眼能否发现 |
|---|---|---|---|
| CSS display:none | <a href="xxx" style="display:none">关键词</a> | footer.php、sidebar.php | 不能 |
| opacity:0 / visibility:hidden | <span style="opacity:0"><a href="xxx">关键词</a></span> | 文章内容区、评论区 | 不能 |
| font-size:0 / text-indent:-9999px | <div style="font-size:0"><a href="xxx">关键词</a></div> | header.php、底部版权区 | 不能 |
| iframe零宽高 | <iframe src="xxx" width="0" height="0"></iframe> | 页面任意位置 | 不能 |
| 背景色同化 + 极小字体 | <a href="xxx" style="color:#fff;font-size:1px">关键词</a> | 白色背景区域 | 不能 |
还有更高级的:用JavaScript动态生成暗链,你查看页面源代码看不到,只有浏览器渲染后才会出现;把暗链放在base64编码的PHP代码里,decode之后才执行;甚至有人用CSS伪元素::after的content属性插入链接文字,搜索工具如果只扫DOM节点都扫不到。

容易被忽略的藏匿位置:WordPress的wp_options表里(尤其是option_name包含"widget"或"footer"的字段)、数据库post_content中被加密的HTML实体编码、.htaccess文件中的重定向规则、以及被篡改的robots.txt(用来引导搜索引擎抓取暗链目标页面)。
二、手动排查怎么查,五步定位法
在讲批量工具之前,先说手动排查的方法。因为工具不是万能的,有些暗链藏得特别深,工具扫不出来,但人工逐项排查一定能找到。
1右键查看网页源代码——在浏览器里按Ctrl+U,搜索关键词:display:none、visibility:hidden、opacity:0、font-size:0、text-indent:-9999、width:0、height:0、position:absolute;left:-9999。搜到任何包含a标签的匹配项,点进去看href指向哪。
2搜base64编码特征——在源码里搜"base64_decode"、"eval("、"gzinflate"、"strrev"、"preg_replace"。这些函数常被用来混淆暗链代码。
3检查footer.php、header.php、functions.php——这三个是暗链最喜欢藏身的地方,特别是footer.php里的版权声明区域。用FTP下载下来,逐行扫描任何看起来不正常的链接。
4查数据库异常内容——进入phpMyAdmin,搜索wp_posts表中post_content字段包含"display:none"、"opacity:0"、"
5用Google Search Console查外链——如果网站已经被大量植入了暗链,搜索引擎可能已经抓取了这些链接。在GSC的"链接"报告里,查看是否有来源不明或内容不相关的外部链接指向你的网站,反过来推可能存在的暗链页面。
三、六个暗链检测工具,从在线扫描到开源部署
手动排查适合1-3个站,站多了还是得上工具。下面是目前可用的六个方案,按使用门槛从低到高排列。
Libra(天秤座)
类型:开源Python项目,本地部署
功能:篡改检测、暗链扫描、后门识别、死链分析
模式:首页/二级页面/全站/自定义扫描
适合有一定技术基础的用户,GitHub上近300 Star,通过特征库匹配暗链模式,支持批量添加站点。
渊照暗链扫描器
类型:专业暗链扫描工具
功能:支持本地文件/目录/URL三种扫描
特点:智能识别隐藏元素和恶意代码
可扫描本地HTML文件目录,适合在服务器上直接跑,不用通过HTTP请求。对CSS隐藏方式有专门的检测规则。
aljcscan(暗链检查)
类型:开源Python爬虫检测
原理:爬取页面链接→访问→关键字匹配
特点:轻量级,部署简单
适合快速批量筛查,对常见的display:none类型暗链检测效果好,但对JS动态生成的暗链检测能力有限。
DarkLink暗链扫描系统
类型:开源域名级扫描系统
功能:多级页面抓取+敏感内容识别
特点:可扫描失效链接+暗链
针对整个域名进行多级页面抓取分析,适合做全站深度扫描。扫描结果可导出。
在线扫描工具
代表:SiteCheck、Quttera、VirusTotal
优点:零部署,粘贴URL即用
局限:只扫首页,不扫内页
适合日常快速巡检。大部分在线工具只检测首页和几个关键页面,内页的暗链扫不到。不能替代深度扫描。

grep + find 命令行组合
类型:Linux服务器命令行
命令:grep -r "display:none" /网站目录
优势:最快、最全面、零依赖
如果你有服务器SSH权限,grep是最直接的方式。一行命令扫遍所有PHP/HTML/JS文件,比任何图形化工具都快。
四、grep命令行的批量检测,十个站两分钟扫完
如果你管着多个服务器上的几十个网站,逐个用工具扫描效率太低。用SSH+grep的组合可以在几分钟内完成全量扫描。
# 1. 扫描所有PHP文件中包含display:none且含有a标签的行grep -rn --include="*.php" -E 'display\s*:\s*none.*]*width\s*=\s*["\'']?0["\'']?' /www/wwwroot/# 5. 扫描base64编码的可疑代码grep -rn --include="*.php" 'base64_decode' /www/wwwroot/# 6. 扫描opacity:0隐藏grep -rn --include="*.{php,html,css}" 'opacity\s*:\s*0' /www/wwwroot/批量扫描脚本思路:把上面这些grep命令写成一个shell脚本,读取一个站点列表文件(每行一个站点路径),循环执行。扫描结果重定向到日志文件,再写一个简单的筛选脚本把包含外链的匹配行提取出来。一个下午就能把几十个站全部过一遍。
五、找到暗链之后怎么删,不是直接删代码就完了
很多人的第一反应是:找到暗链代码,删掉,完事。但如果网站是被入侵植入的暗链,删掉表面代码只是治标——攻击者留了后门,过两天又给你植回去了。
第一步:隔离
备份+下线
先完整备份网站文件和数据库,然后把网站设为维护模式或暂时下线。防止在清理过程中暗链继续被搜索引擎抓取。
第二步:清源头
找后门
在删除暗链代码之前,先用Webshell扫描工具(如D盾、河马查杀)扫描全站文件,找到攻击者留下的后门文件。不删后门,删了暗链也是白删。
第三步:清暗链
代码+数据库
删除源码中的暗链代码,同时检查数据库中是否也被植入了。如果是WordPress,重点查wp_posts、wp_options、wp_postmeta三张表。
第四步:加固
堵漏洞
更新CMS和所有插件到最新版,修改所有密码(FTP、数据库、后台管理员),检查文件权限设置,安装安全插件。
一个容易被忽略的点:如果暗链是通过数据库注入的(比如WordPress的wp_posts表中被写入了加密的暗链HTML),只替换PHP文件是没用的。需要用SQL语句批量清理:UPDATE wp_posts SET post_content = REPLACE(post_content, '暗链代码片段', '') WHERE post_content LIKE '%暗链特征%';。执行前先备份数据库。
六、站群怎么批量管理暗链,别指望一个个手动查
手上有几十上百个站的,手动排查不现实。需要建立一套自动化的监测和清理机制。
| 管理方式 | 适用规模 | 实现方法 | 自动化程度 |
|---|---|---|---|
| 定时cron+grep脚本 | 10-50个站 | 写一个shell脚本,每周自动执行grep扫描,结果发邮件通知 | 中 |
| Libra批量部署 | 50-200个站 | 在多台服务器上部署Libra,通过Web界面统一管理所有站点 | 高 |
| 文件完整性监控 | 任意规模 | 部署Tripwire或AIDE,监控核心文件(footer.php、header.php等)的MD5变化,一旦被修改立即告警 | 高 |
| WAF + 安全插件 | 任意规模 | WordPress装Wordfence/Sucuri,非WP站点用云WAF(阿里云WAF、Cloudflare),拦截入侵行为 | 高 |
如果用的是UC建站系统管理的站群,多站看板里可以统一配置安全监控规则。系统在HTML直出层面就已经做了内容安全检查,每个站的模板、插件、核心文件都从统一管控中心分发,不会出现某个站装了来路不明的主题而其他站不知道的情况。配合定时文件完整性校验,可以做到暗链植入后几小时内就触发告警。
七、暗链被搜索引擎发现后,怎么恢复收录和权重
暗链清干净了,但搜索引擎的惩罚不会自动解除。需要主动向搜索引擎提交申诉和重新审核。
| 搜索引擎 | 申诉渠道 | 操作要点 |
|---|---|---|
| 百度 | 百度搜索资源平台 → 站点管理 → 反馈中心 | 提交申诉前确保所有暗链已清除、后门已修复。说明被入侵的原因和已采取的修复措施。附上安全扫描报告会加快审核。 |
| Google Search Console → 安全问题 → 请求审核 | Google会在GSC里明确提示检测到的安全问题类型。按提示修复后点击"请求审核",通常1-2周出结果。恢复期间持续提交sitemap。 | |
| 360/搜狗/必应 | 各平台站长工具 → 反馈/申诉入口 | 流程类似,清除后提交申诉。必应的Bing Webmaster Tools里可以看到具体的安全警告。 |
申诉被拒的常见原因:① 暗链没清干净,搜索引擎爬虫重新访问时又发现了隐藏链接;② 网站漏洞未修复,攻击者重新植入了暗链;③ 提交的材料不够详细,只说"已修复"但没有说明修复了哪些具体问题。申诉前先自己用工具再扫一遍,确认零暗链。
八、日常防护比事后补救重要一百倍
暗链问题最好的解决方案是"不让它发生"。几个成本不高但效果显著的措施:
每周自动扫描
设置cron任务,每周执行一次grep扫描(暗链特征+后门特征),结果邮件通知。10分钟配置,长期省心。
只从官方源装插件
WordPress插件从wordpress.org下载,主题从正规市场购买。"破解版""免费版"商业主题是暗链植入的重灾区。
文件权限最小化
PHP文件权限设为644,目录设为755。wp-config.php设为600。不给攻击者可写的文件环境。
定期更新CMS和插件
WordPress核心、主题、插件保持最新版本。绝大多数暗链植入都是通过已知漏洞进行的,及时更新能挡住80%以上的攻击。
小结
网站暗链这件事,最可怕的不是被植入了暗链,而是被植入了自己完全不知道。每天看着后台数据正常、页面显示正常,搜索引擎却在背后默默地给你的站降权。
排查暗链的思路其实很清晰:先用grep命令行或扫描工具做全量检测,找到暗链后先查后门再清代码,然后做数据库清理,最后加固漏洞防止复发。单个站半小时搞定,站群的话建立自动化监控机制,每周跑一次扫描脚本。
关键是养成习惯:别等到排名掉没了才发现。
