CDN节点污染?别慌,先看看你家网站是不是正在“中毒”

打开网页,图片加载一半就卡住,控制台一堆404MIME type错误。服务器日志干干净净,运维说CDN一切正常。你换个手机、开个代理,页面秒开——这会儿你就该警觉了:不是代码坏了,是CDN某个节点偷偷给你塞了假文件。

它不报错,也不宕机,就是悄悄把你的app.js换成一段跳转代码,把logo.png返回成HTML乱码。用户刷不出来,搜索引擎抓到的全是错误页,而你还以为是前端兼容性问题。

第一个信号:怎么判断你的CDN节点被污染了?

别急着重发版本、别急着查Nginx配置。先看这三点:

  • 同一个页面,联通用户能打开,移动用户白屏,电信用户加载一半卡死;
  • 清缓存、换设备、换浏览器,问题照旧;
  • 用在线工具(比如 WebPageTest)抓包,发现某个CSS文件返回的明明是HTML内容,甚至带广告跳转链接。

我帮一个本地生活平台排查过类似问题:用户反馈APP内嵌页频繁闪退。最后定位到某CDN厂商华北节点,返回的JS文件开头被硬塞了一段eval(atob(...)),浏览器执行后直接崩溃。验证方法很简单:用curl -H "Host: yourdomain.com" http://[边缘节点IP]/static/js/main.js,再跟源站文件做md5sum对比。不一致?基本坐实污染。

污染从哪里来?这3个源头最隐蔽

源头一:共享IP池里的“邻居”被黑了。

CDN节点上跑着几百上千个站点。隔壁那个小博客被挂马、被当成肉机发包,运营商一怒之下把整个IP段加入黑名单。你的域名没动过一行代码,但访问请求被限速、被拦截、被丢包——你不是受害者,是连带遭殃的路人。

源头二:回源时被中间人“下药”。

攻击者伪造请求头,骗CDN节点缓存一个根本不存在的“新版”文件。比如,他用假的If-None-Match头触发回源,实际返回的是挖矿脚本。源站文件干干净净,但CDN节点上存的就是毒。你刷新缓存没用,因为“缓存”本身已经被定义为“合法版本”。

源头三:DNS在半路被人调了包。

有些地方宽带、公共WiFi路由器,会劫持你的DNS查询,把cdn.yourdomain.com解析到一个钓鱼IP上。你看到CDN后台流量涨了,其实是恶意流量在刷接口;用户点开你的链接,跳转到博彩页面——而你还在后台看“缓存命中率98%”。

3个方法,自己动手清理污染节点

方法一:别只点“刷新缓存”,要让它真正“重来一遍”。

很多CDN控制台的“刷新”只是删索引,文件还躺在节点硬盘上。更有效的做法是:在资源URL里加一个带时间戳的参数(比如?v=20240515),强制所有节点重新回源拉取。如果污染严重,干脆在控制台暂停CDN服务5分钟,等边缘节点全部失效,再重新启用——相当于给整条链路来次硬重启。

方法二:揪出问题IP,直接拉黑。

从用户上报的错误截图、Sentry日志或CDN自带的访问日志里,找出高频出错的边缘节点IP。用ipip.net查归属地和运营商,然后在CDN后台的“IP黑白名单”里,把这个IP段加进黑名单。后续请求会自动绕开它,切到其他节点。损失一点局部访问速度,好过全站不可用。

方法三:DNS切走,10分钟切换备用CDN。

主CDN掉链子时,别等它修好。提前配好另一家CDN(建议选底层架构不同的,比如一家用自建机房,一家用运营商合作节点),把cdn.yourdomain.com的CNAME记录指向备用厂商。切完立刻跑一遍预热脚本,避免源站被突发回源打崩。这个操作你平时就该练过,就像消防演练。

如何防止二次污染?回源验证是关键

清理完不代表安全了。很多团队第二天又中招,是因为只清了“症状”,没管“病根”。

最实在的做法:在源站放一个/verify.txt,里面写一句只有你知道的短语(比如cdnclean-2024-q2)。再写个简单脚本,每小时用不同地区的真实CDN节点IP去请求它,比对返回内容。一旦发现不对,立刻发企业微信告警,并自动触发缓存刷新。

进阶一点:给所有静态资源URL加上时间戳+签名,比如/css/index.css?t=1715760000&sig=abc123。CDN只缓存带有效签名的请求,伪造的URL压根拿不到资源——命中率会略降,但污染成本高到攻击者懒得试。

被污染后,权重还能救回来吗?

能,但得快。搜索引擎发现你连续返回错误内容或恶意跳转,会迅速给你贴上“不安全”标签,排名断崖下跌。

第一步:立刻登录百度搜索资源平台或Google Search Console,提交“人工审核”,附上清理前后的对比截图(重点标出HTTP状态码、响应头、返回内容)。

第二步:在网站根目录放一个clean.txt,写清楚污染发现时间、处理动作、验证方式。让爬虫一眼看懂:“这站已经清干净了”。

有个知识付费站点被污染三天,他们没折腾域名迁移,而是做了两件事:一是把所有静态资源路径批量替换为新子域名(如static2.yourdomain.com),二是给这个子域名开启HSTS预加载。两周后自然流量恢复大半——搜索引擎对“全新、干净、强加密”的子域名,信任度天然更高。

今天就能执行的1个操作

打开你正在用的CDN控制台(阿里云CDN、腾讯云CDN、又拍云、七牛都行),找到「回源设置」→「回源协议」,把选项从“跟随客户端请求”改成“强制HTTPS”。
接着去「缓存配置」里,新建一条规则:匹配路径*.js*.css,缓存时间设为3600秒(1小时)。
改完保存——不用发版、不用重启,5分钟生效。HTTPS回源能堵住大部分中间人篡改,短缓存则让污染文件更快过期。这一步做完,你被投毒的风险,真的会少一大截。