前言
最近在使用一款名为 Mirage 的 WordPress 主题时,发现该主题内置了多层版权强制保护机制——一旦你尝试修改或移除页脚中的”Powered by Mirage”链接,网站就会直接显示空白页面。本文将完整记录审计和移除这三层保护机制的过程,供遇到同样问题的朋友参考。
问题现象
- 移除 footer.php 中的 Mirage 版权链接后,前端页面显示空白
- 换全新域名部署也一样,排除缓存问题
- 浏览器控制台无报错,页面直接被清空
审计发现:三层保护机制
第一层:PHP 服务端检查 —— vt_footer_check()
文件:inc/helper.php 第82-96行
function vt_footer_check() {
$footer = file_get_contents(get_template_directory() . '/footer.php');
if (strpos($footer, base64_decode('TWlyYWdl')) === false) {
die(); // 直接终止页面渲染
}
}
原理: 用 base64_decode('TWlyYWdl') 解码得到字符串 "Mirage",然后检查 footer.php 文件内容中是否包含该字符串。如果不包含(说明你删了版权链接),直接 die() 杀掉整个页面。
触发入口:inc/setting.php 第3行 调用了此函数。
第二层:JS 客户端检查(源码)
文件:assets/js/src/index.js 第40-42行
// vt_footer_check 的 JS 版本
var el = document.querySelector('a[copyright]');
if (!el || el.innerText !== "Mirage") {
document.body.innerHTML = 'keep_theme_footer'; // 清空整个页面
}
原理: 在浏览器端再次检查 DOM 中是否存在带 copyright 属性且文字为 “Mirage” 的 <a> 标签。如果不存在或文字不对,直接用 innerHTML 清空 <body> 的所有内容。
第三层:打包后的 JS 文件残留
文件:assets/js/index.js(打包压缩后,约65KB)
源码经过 webpack/rollup 等工具打包后,上面的 JS 检查逻辑被编译进了产物文件中,出现在 第44行和第2042行两处(不同打包阶段产生的重复代码)。
这就是为什么只改源码不够——WordPress 加载的是打包后的 index.js!
修复方案
第一步:禁用 PHP 检查
inc/helper.php — 将函数体改为空返回:
function vt_footer_check() {
return; // 直接返回,不做任何检查
}
inc/setting.php — 注释掉函数调用(或保留调用也无害,因为函数已空):
// vt_footer_check(); // 已禁用
第二步:移除 JS 源码检查
assets/js/src/index.js — 删除或注释掉以下代码块:
// 删除 vt_footer_check 函数定义及调用(约第40-42行)
第三步:移除打包后 JS 检查(最关键!)
assets/js/index.js — 这是 WordPress 实际加载的文件,必须处理其中的两处 document.body.innerHTML = 'keep_theme_footer':
- 第44行附近:删除/注释 innerHTML 赋值代码
- 第2042行附近:同样处理(这是打包产生的重复)
可以用编辑器搜索 keep_theme_footer 关键字,确保所有匹配项都被处理。
第四步:修改页脚
footer.php — 移除或替换 Mirage 版权链接:
<!-- 原来的 -->
<a copyright href="...">Mirage</a>
<!-- 改为你自己的 -->
<a copyright href="https://your-site.com">Your Site</a>
⚠️ 注意:如果你还想保留
a[copyright]选择器的存在(避免 JS 报错),可以保留标签结构但更改链接和文字。
修复验证
完成以上修改后,按顺序验证:
- 本地搜索确认:
# 在主题目录下搜索,应该只有 helper.php 中的空壳函数
grep -r "keep_theme_footer" .
grep -r "vt_footer_check" .
- 上传到服务器后,强制刷新浏览器:
- Windows:
Ctrl + Shift + R - Mac:
Cmd + Shift + R
💡 重要: 修改静态资源(JS/CSS)后,浏览器可能继续使用缓存的旧版本。如果页面仍然空白,先试硬刷新!
- 线上验证: 访问你的网站首页和文章页,确认正常显示。
额外发现
Phone-home 行为
assets/lib/admin.js 中的 infoInit() 函数会向 https://vtheme.cn/wp-json/wm/v1/info POST 发送以下信息:
- 你的域名
- 项目名称
- 主题版本
这是一个”回传”行为(phone-home),虽然不会导致页面空白,但涉及隐私。如介意可一并处理。
CSS 问题
审计中还发现 style.css 中 .toc-body 选择器因格式问题被错误解析为 body { display: none; },这也会导致页面空白。如果你的站点使用了目录(TOC)功能,需要检查此项。
总结
| 保护层 | 文件 | 方法 | 修复方式 |
|---|---|---|---|
| PHP 服务端 | inc/helper.php | die() 终止渲染 | 函数体改为 return; |
| PHP 触发 | inc/setting.php | 调用检查函数 | 注释掉调用 |
| JS 源码 | assets/js/src/index.js | 清空 body | 删除代码块 |
| JS 打包 | assets/js/index.js | 清空 body(两处) | 删除/注释 |
| 页脚 HTML | footer.php | 版权链接 | 替换为自定义 |
写在最后
作为开源/免费主题,作者通过这种方式保护自己的署名权可以理解。但如果你是付费用户或需要自定义页脚,希望这篇教程能帮到你。
建议: 修改前务必备份原文件,以便随时恢复。
本文基于实际操作整理,如有遗漏欢迎补充。

