本文约 2,908 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
很多人不知道,网站会「主动上报」自己用的 WordPress 版本号。访客按 Ctrl+U 查看源码,往往能看到一行 <meta name="generator" content="WordPress 6.x" />;直接访问 https://你的域名/readme.html 还会看到一个版本说明页;链接里也常带着 ?ver=6.x 这样的参数。这些信息对普通访客毫无意义,但对攻击者却是精准导航:他一旦发现你的版本对应某个公开漏洞,就能直接拿现成的利用脚本打你。隐藏版本号并不能修补漏洞本身,但它能让你不再是「一眼可辨的软柿子」,把大量自动化扫描挡在门外。本文给出一套只改 functions.php 就能完成的隐藏方案,并提醒别陷入「藏了版本就安全」的误区。
故障原因分析
- 核心会输出 generator 标签。WordPress 默认在
<head>里通过wp_generator打印版本号,这是最主要的信息源。
readme.html明示版本。根目录的readme.html默认保留,打开就能看到 WordPress 版本和许可信息,等于把版本写在门口。
- 资源 URL 带
?ver=参数。WordPress 给核心脚本、样式附加版本参数用于缓存控制,其中就包含了版本号线索。
- RSS/Feed 里的 generator。订阅源、站点地图等也可能输出 WordPress 版本与相关标识。
- 攻击者沿版本查漏洞库。拿到版本号后,攻击者会在漏洞库比对,选择对应的旧版插件/核心漏洞利用,命中率大幅提高。
分步解决方案
方法一:先看看自己的版本暴露在哪些地方
浏览器打开网站首页,右键「查看网页源代码」,搜索 generator 和 ver=;再直接访问 https://你的域名/readme.html。把暴露点都记下来,方便改完后对照验证。
方法二:用 functions.php 移除 generator 与版本参数
把以下代码加入当前主题的 functions.php(强烈建议用子主题,避免主题升级后代码被覆盖):
// functions.php —— 隐藏 WordPress 版本信息
// 1) 移除 <head> 里的 generator 版本标签
remove_action( 'wp_head', 'wp_generator' );
// 2) 从样式和脚本的 URL 中移除 ?ver= 版本参数
function mimang_remove_version_query( $src ) {
if ( strpos( $src, 'ver=' ) ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
}
add_filter( 'style_loader_src', 'mimang_remove_version_query', 9999 );
add_filter( 'script_loader_src', 'mimang_remove_version_query', 9999 );
// 3) 移除 RSS/Feed 中的 generator 版本信息
add_filter( 'the_generator', '__return_empty_string' );
保存后刷新前台源码,generator 和 ?ver= 应该都消失了。如果是用代码片段插件(如 Code Snippets)也可以,不必改动主题文件。
方法三:处理 readme.html 与 license.txt
这两个文件平时没有任何用途,可以直接删除或改名:
cd /www/wwwroot/yoursite.com
mv readme.html readme.html.bak
mv license.txt license.txt.bak
或者用 .htaccess 拒绝访问:
<Files ~ "^(readme\.html|license\.txt|readme\.txt)$">
Order Deny,Allow
Deny from all
</Files>
注意:WordPress 升级时可能会重新生成 readme.html,所以升级后建议再检查一次并重复处理。
方法四:用安全插件统一处理
Wordfence、iThemes Security 等插件都内置「隐藏 WordPress 版本」的选项,勾选即可移除 generator、限制 readme.html 访问。懒得改代码的站长可以用插件一键完成,思路和上面一致。这类插件的好处是升级后仍持续生效,不必担心主题或核心更新把改动覆盖掉,适合不想频繁维护代码的人。
方法五:把真正的防护做到位
隐藏版本是「少给线索」,真正的安全靠的是「不给漏洞」:务必保持 WordPress 核心、主题、插件为最新版本,及时打补丁;删除不再使用的主题和插件;启用安全插件做扫描与防火墙。隐藏版本只降低被自动扫描命中的概率,绝不能替代更新与修复。
常见踩坑点
- 以为隐藏版本就安全了。这是最大的误区,版本藏得再好,漏洞没补一样会被打,更新永远比隐藏重要。
- 只删 generator,漏掉
?ver=。源码里的?ver=仍然是版本线索,要一并过滤。
- 直接改主题文件被升级覆盖。改
functions.php一定要用子主题或代码片段插件,否则主题一更新就白改。
- 忘记 readme.html 会复活。WordPress 升级可能重新生成该文件,升级后要复查。
- 过滤
?ver=导致缓存失效。移除版本参数可能让浏览器缓存策略变化,改完若发现样式没更新,清一次缓存即可。
- 用了过时的「改主题头部版本注释」老办法。那只是改主题版本,不是 WordPress 版本,方向搞错了,真正要处理的是 generator 标签和核心的
?ver=。
- 改了缓存插件缓存的页面却没清理。版本参数移除后,旧缓存页面里可能仍带着
?ver=,记得清一次缓存再验证。
- 把子主题当摆设。若把过滤代码写进父主题,主题一升级就被覆盖,隐藏效果随之失效,务必放进子主题或代码片段插件。
总结
WordPress 默认会把版本号写在 generator 标签、readme.html 和 ?ver= 参数里,等于向攻击者递上一份「我的版本是几」的说明书。用 functions.php 移除 wp_generator、过滤样式脚本的 ver 参数、清掉 readme.html,再配合 Wordfence 等插件,就能把大部分版本线索藏起来,让自动化扫描难以精确命中。但要牢记:隐藏 WordPress 版本号只是降低被针对性攻击的概率,真正决定安全的是及时更新和修复漏洞。把「藏线索」和「补漏洞」两件事都做到,站点才算稳。
