WordPress 又出上古Bug?你的 Feed 订阅源里面居然藏着一个博彩网站?!
早上习惯性刷 RSS 订阅,看到了宗宗酱发的一篇提醒:你的RSS订阅源有跳菠菜的风险
心里一惊,赶紧翻开自己博客的 Feed 页面扫了一眼。果不其然,根标签里赫然躺着这一行:

1. 祸起 wellformedweb.org:黑产是如何盯上 WordPress Feed 的
因为是个历史包袱,我就不细说了,你只要知道这个东西是上古时期用来“让读者在RSS阅读器里,能给博客发表评论”用的就行了,这是 RSS 规范的一部分,但这玩意对垃圾评论的防御力几乎是零,所以在十多年前就已经被时代无情淘汰,但没办法啊,为了绝对的向后兼容, WordPress 依然将这行代码原封不动地保留至今。。
最近 wellformedweb.org 域名过期了,就被黑产团伙抢注了。虽然 WordPress 只是把它写在“XML 命名空间”里,WordPress 本身在生成 Feed 时,绝对不会去这个网址下载任何代码。正常 RSS 阅读器也不会去访问这个网址,除非有人直接看你的 Feed 源码,然后手动去点这个网址(能不能点开都两说,毕竟正常情况下此处并不会被渲染为超链接)。
但是云服务商、网管部门、第三方安全插件会无差别提取页面内的所有 URL 链接(哪怕它只是个 xmlns 命名空间里的字符串),这一扫,就发现这个 URL 指向了一个博彩网站,搞不好就直接判定你的网站“包含低俗、赌博等违规内容”,进而触发自动化报警,轻则发邮件警告让你限期整改,重则直接判定违规封禁主域名或IP。
以及不排除未来这个 URL 会进入全球恶意欺诈黑名单,这会导致有些阅读器或者开启了严格安全保护的浏览器,因为探测到你的订阅源含有这个URL,直接给访客弹个“该网站包含危险欺诈内容”的红色标签页警告,这不是纯纯的无妄之灾嘛,所以这行代码最好还是尽早删掉。
2. 拒绝粗暴改核心:寻找更优雅的动态方案
看了看网上给出的普遍解法,都是让人“直接去修改 wp-includes/Feed-rss2.php 文件,删掉这一行”。
这就有点不够优雅了,动系统文件向来是慎之又慎的事情。一个不小心直接改炸了不说,而且一旦 WordPress 升级,修改搞不好就被直接覆盖了,属于治标不治本。
那既然不打算动核心文件,那就只能考虑动态移除。最显而易见的修改方案有两个:
- Nginx 前端替换:性能最高。但我目前的架构前端套了香港反代,为了保险起见,要改就得两头一起改,折腾起来有点费事。
- PHP 动态修改:考虑到 Feed 页面本身是有缓存的,我不更新文章,Feed 缓存基本就不会动。所以 PHP 带来的那点性能损耗几乎可以忽略不计,折腾起来最省心。
所以我决定用 PHP 搞定问题。跑去问了下 AI 这个标签的钩子是啥。结果 AI 一摊手:硬编码,没钩子。
啊,这……行吧,既然你不给钩子,那就别怪我直接对输出缓冲区下手了。
3. 最终修复方案:用 PHP 代码动态净化 WordPress Feed 订阅源
在 Code Snippets 插件中新建一个代码段(选择在所有位置运行),或者写到你当前主题的 functions.php 文件中也行。利用 PHP 的 ob_start 在页面渲染完成、输出前的最后一刻,把这个 URL 给滤掉。
PS:更新,经评论区提醒,WordPress不仅会在 RSS 订阅源开头声明 wfw ,在后面每篇文章的结尾还有生成RSS评论区的代码:<wfw:commentRss>https://XXXXXX/feed</wfw:commentRss>。这部分也需要同步去除,不然只移除开头的命名空间,而不移除每篇文章的RSS评论区。 RSS 阅读器会一脸雾水,哪来的wfw啊,导致报错。
代码如下:
/**
* 移除 WordPress RSS2 中的 CommentAPI 命名空间及相关标签
*/
add_action('template_redirect', 'perfect_clean_rss2_buffer', 0);
function perfect_clean_rss2_buffer() {
// 仅对 RSS2 订阅源生效
if (is_feed('rss2')) {
ob_start('rss2_namespace_cleaner');
}
}
function rss2_namespace_cleaner($buffer) {
// 1. 匹配并移除开头的命名空间声明
$search_pattern = '/xmlns:wfw="http:\/\/wellformedweb\.org\/CommentAPI\/?"\s*/i';
$buffer = preg_replace($search_pattern, '', $buffer);
// 2. 匹配并移除每篇文章下的 <wfw:commentRss> 标签
$comment_pattern = '/<wfw:commentRss>.*?<\/wfw:commentRss>\s*/i';
$buffer = preg_replace($comment_pattern, '', $buffer);
return $buffer;
}
小提示:保存并启用代码后,如果刷新页面没变化,八成是有什么东西给你的Feed做了缓存,记得去后台刷新一下你的站点缓存
附:Nginx 的替换方案
如果你不想动 PHP,且你的 Nginx 编译了 sub_filter 模块,也可以直接在 Nginx 配置文件中加入以下规则动态替换:(让AI写的,我没实际测试过)
location ~* /Feed/?$ {
sub_filter 'xmlns:wfw="http://wellformedweb.org/CommentAPI/"' '';
sub_filter_once off;
sub_filter_types application/rss+xml text/xml;
try_files $uri $uri/ /index.php?$args;
}
写在最后
不得不感叹一句,最近黑产真的越来越钟情于这种“历史遗留域名过期被恶意抢注(内容劫持)”的连带攻击方式了。
他们利用了对老域名的盲目信任,不需要入侵你的服务器,就能白嫖全球无数独立博客的连带流量和权重,不可谓不鸡贼。在 WordPress 官方正式移除这行代码之前,建议各位站长,赶紧去排查并手动移除自己的 /feed 隐患


GTX690战术核显卡导弹
2026-06-25 22:03
哈哈哈,Typecho也中招了😅
感谢分享,不过我就懒得修了,毕竟大家都出问题就不是我的问题了()
去年夏天
2026-06-26 09:13
其实这东西本身太会有安全隐患,主要是怕一些安全扫描工具误判了。
平哥
2026-06-18 16:52
这个提醒及时,一般人注意不到,我的tyoecho里也有,清除掉了。只是有个问题,程序更新后,怕是到时候又忘了。
织梦岁月
2026-06-11 18:29
还真是,我的博客里也看到了
去年夏天
2026-06-12 11:05
WP的历史包袱太重了,早就没人用的功能也不敢删,只要不出事就不动
石猫
2026-06-10 18:48
我的要看什么时候w3.org和Jekyllrb.com掉了
去年夏天
2026-06-11 15:59
这要是掉了,乐子就大了
茗辰原
2026-06-10 11:28
这才是真正的大佬,还好我问从WordPress迁过来了,暂时有没风险
去年夏天
2026-06-11 11:14
WP这些框架历史兼容包袱太重,哎。
老刘博客
2026-06-10 11:03
有点吓人,另外,网站首页文章列表,摘要下面的日期,分类在小屏幕上显示有点问题,有点错乱
去年夏天
2026-06-11 11:14
目前手机横屏和平板横屏下确实文字会错乱。这个问题已经让我头秃很久了,文字正常,图片不正常,图片正常,文字不正常。
dousha
2026-06-09 14:22
wellformedweb.org在至少 5 年前 (2021-05-17) 就已经有人在 SO 上汇报不可达了;但是 RSS Advisory Board 在 2023-08-10 发布的文档却仍然在使用这个链接,不得不感叹复制粘贴的惯性还是太大了。其实
xmlns后面跟着的网址只要保证唯一就行,它可以不指向任何 schema 或者任意有效的资源。这也意味着可以改成诸如my.site.invalid这种保证没法被注册的域名。去年夏天
2026-06-09 14:53
初然忆
2026-06-08 23:53
我博客现在就只带个www.w3.org ,康康哪天被抢注了🤣
去年夏天
2026-06-09 11:22
这要是被抢注了,那可乐子大了
大致
2026-06-08 11:54
文件里没有钩子,但文件外面有。可以把feed-rss2.php拷贝出一份,去掉那两行,然后利用‘do_feed_rss2’,先移除再添加,把feed-rss2.php换成自己的。你这里好像不让粘代码。反正也没差多少,优雅不到哪里去。这个文件很久没更新了,版本升级后仍旧用自己的问题也不大。
去年夏天
2026-06-08 12:21
也是个很好的思路👍
花非花
2026-06-08 10:45
这些老域名啊,还真是不能盲目相信
去年夏天
2026-06-09 11:19
真的是,防不胜防,突然就变了。
fengc's Blog
2026-06-07 09:07
这…这….真是无孔不入啊,
去年夏天
2026-06-08 10:41
这都能想到去利用……哎
依云
2026-06-06 23:19
想起libsoup的 .org 旧官网也是这样,我当时还疑惑了好久:我明明是从GNOME还是GTK那边点过来的啊。然后才意识到libsoup早不用独立域名了,他们有链接还没更新。
去年夏天
2026-06-08 10:39
域名这东西,尤其是有一定传播度的域名,轻易别换。
Huo
2026-06-06 23:04
我是按宗宗酱那样删的 目前没发现问题 就是以后更新的时候得记着这事了
去年夏天
2026-06-08 10:37
嗯,主要就是担心更新后文件被替换回去了
石樱灯笼
2026-06-06 21:55
我是把所有
xmlns:wfw都替换成了www.rssboard.org/comment-api(然后就等着哪一天rssboard.org也挂掉了)去年夏天
2026-06-08 10:36
“在RSS阅读器内评论文章”这个需求也过于历史了
obaby
2026-06-06 21:36
我就是简单粗暴的删除的那个东西,貌似没报错
去年夏天
2026-06-08 10:33
主要是担心更新后WP又偷偷给加回去了,之前被这样坑过……
obaby
2026-06-08 16:08
哈哈哈。有可能。
希望wp官方直接修复这个问题,那就最简单了。
去年夏天
2026-06-09 11:21
估计不会太及时修,毕竟这不算什么高优先级的漏洞
Lvtu
2026-06-06 20:25
防不胜防。。。
去年夏天
2026-06-08 10:33
老项目被黑产接手最近总有,哎……
Skylwn
2026-06-06 19:36
我用FreshRSS订阅你的RSS源,今天这个订阅源挂掉了🤣,我找了找原因,应该这篇文章有关系,可能是前面的命名空间前缀被删掉了识别不出来的元素
Skylwn
2026-06-06 19:37
识别不出wfw:commentRss
去年夏天
2026-06-06 19:50
感谢提醒,没注意到每篇文章后面还有引用语句类似:
<wfw:commentRss>https://www.tjsky.net/tutorial/1633/feed</wfw:commentRss>之类的格式,把这个也删除了就好了Lvtu
2026-06-23 18:41
我昨天也遇到这个问题,后面让AI帮我解决的。。。
acevs
2026-06-06 14:01
不错的发现~
去年夏天
2026-06-09 11:18
防不胜防啊
S
2026-06-06 13:18
感谢分享。
去年夏天
2026-06-09 11:18
感谢来访~