// 移除 head 里的版本号
remove_action('wp_head', 'wp_generator');
// 移除 RSS 里的版本号
add_filter('the_generator', '__return_empty_string');
// 移除脚本 / 样式 URL 的 ?ver= 参数
add_filter('script_loader_src', 'wpx_remove_ver');
add_filter('style_loader_src', 'wpx_remove_ver');
function wpx_remove_ver($src) {
return $src ? remove_query_arg('ver', $src) : $src;
}
WordPress 默认会在多个位置输出当前版本号:前台 HTML 的 <meta name="generator"> 标签、
RSS 订阅源的 generator 节点、以及脚本和样式文件 URL 后面的 ?ver= 参数。
这些信息本身不构成漏洞,但它给了攻击脚本「按图索骥」的便利。抹掉版本号属于纵深防御的一环, 真正决定安全的是及时更新核心、主题和插件,以及防火墙和备份策略。
降低扫描命中
自动化扫描脚本会优先尝试已知版本漏洞,没有版本号就少了一条线索。
轻微提速
去掉 ?ver= 参数后,部分 CDN 和浏览器的缓存命中率会略高。
无副作用
不影响前台显示、后台功能、插件运行,也不影响自动更新。
-
1
确认已有子主题
代码要放在子主题的 functions.php 里,直接改父主题文件的话,主题更新会覆盖你的修改。 如果还没建子主题,先看下面的教程。
子主题创建教程 -
2
打开子主题的 functions.php
后台「外观 → 主题文件编辑器」里选择子主题的 functions.php; 或者用 FTP / 主机文件管理器打开
/wp-content/themes/子主题/functions.php。 -
3
粘贴代码并保存
把整段代码粘到文件末尾。注意检查不要粘在
?>后面, 也不要在开头遗漏<?php标签。 保存前建议先用本地编辑器格式化一下,避免粘贴错乱。 -
4
清缓存后验证
如果有缓存插件,先清一遍缓存。然后按下面的方法检查版本号是否已消失。
注意事项
- 先去 ?ver= 会影响缓存刷新。某些 CDN 或浏览器缓存策略依赖这个参数判断文件是否变化。如果你站点启用了强缓存,每次更新主题或插件后可能需要手动清一次缓存。
- 不能代替及时更新。移除版本号只是降低被扫描的概率,不修复任何漏洞。核心、主题、插件该更新还是要更新。
- 部分安全扫描工具会报警。有些站点安全检测工具会因为你隐藏了版本号而给出提示,这是正常的,忽略即可。
- 改前备份。改 functions.php 之前,先复制一份原文件到本地。万一出错,能立刻还原。
改完后清一遍缓存,用下面的方法检查。三种检查都通过就说明生效了。
在浏览器里打开首页,右键「查看页面源代码」,搜索 generator。
// 改之前
<meta name="generator" content="WordPress 6.8" />
// 改之后
(已消失)
访问 你的域名/feed/,搜索 generator。
应该看到空节点,或者完全没有这个标签。
在页面源码里搜索 ?ver=。
应该看不到 WordPress 自己的脚本和样式带有这个参数(第三方插件的可能不受影响)。
wp_enqueue_script
注册的脚本。有些插件用了自定义的加载方式,或者注册的时候把优先级设得更高,
就不一定被覆盖。如果要连插件的一起处理,可以把 add_filter 的第三个参数改成 999。