干这行快十年了,前阵子帮一个客户收拾烂摊子,网站被挂马,数据库被拖了三次,每次清理完不到一周又中招,客户急得直跳脚,我排查完所有插件、主题、服务器日志,最后发现罪魁祸首居然是WordPress自带的XML-RPC接口,这玩意儿平时屁用没有,但一旦被黑客盯上,就是你站点最大的破口。
真实踩坑:一个XML-RPC让我的服务器CPU飙到100%
那年我帮一个外贸站做优化,老服务器配置不高,突然有一天阿里云报警CPU跑满,SSH连上去一看,进程列表里全是php-fpm,每个都在执行同一个文件——xmlrpc.php,再查Apache访问日志,好家伙,同一个IP每秒发几十个POST请求,全打在/xmlrpc.php上,黑客用这个接口做“放大攻击”,一次请求可以调用几百个WordPress账号密码组合,比直接暴力破解wp-login.php效率高了几十倍。

WordPress被暴力破解?别急着加防火墙,先禁掉XML-RPC这个后门
更坑的是,我一开始没意识到问题,还以为是被CC攻击,上了CDN、加了WAF,花了钱没解决,后来手动禁用了XML-RPC,CPU瞬间降下来,那个IP再也没来骚扰过,从那以后,我接手任何WordPress项目的第一件事,就是先把这个口子堵上。
解决方案:三种禁用方法,从简单到彻底
主题函数禁用(最省事)
在主题的functions.php里加一行代码:
add_filter('xmlrpc_enabled', '__return_false');
别小看这一行,它能让所有XML-RPC请求直接返回403,但这方法有个弊端——如果你用的主题或插件需要XML-RPC功能(比如某些移动端App、Jetpack),那就会失效,不过说实话,99%的站点根本不需要XML-RPC,用这方法足够。
.htaccess规则拦截(推荐)
如果你用的是Apache服务器,在WordPress根目录的.htaccess文件里,加这段:
<Files "xmlrpc.php"> Order Deny,Allow Deny from all </Files>
加在# END WordPress那行后面,别加到WordPress自己的规则里,不然容易冲突,这样不管谁来请求xmlrpc.php,直接404,连PHP解析都不执行,最省资源。
如果你用Nginx,就在server块里加:
location = /xmlrpc.php {
deny all;
}
我见过好多教程只写Apache的,害得Nginx用户到处找方法,其实就这么一行,改完重载配置就行。
纯代码禁用XML-RPC的pingback功能(保留其他功能)
有些站点确实依赖XML-RPC,那你可以只关闭pingback和trackback,不让别人用它来反射攻击,在functions.php里加:
add_filter('xmlrpc_methods', function($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
这样XML-RPC接口还通着,但最容易被利用的pingback功能被关掉,不过说实话,能完全禁用就别留后门。
推荐配置:别只靠一个插件,要层层设防
市面上很多安全插件都能一键禁用XML-RPC,比如Wordfence、iThemes Security,但我个人建议,插件不是万能药,Wordfence这种重型插件本身就会拖慢网站速度,而且如果你没配好,它自己的规则也可能被绕过。
我的推荐配置是:
- 服务器层面拦截 —— 用上面的.htaccess/Nginx规则,这是第一道闸,PHP框架根本跑不起来。
- 防火墙插件 —— 如果你已经装了Wordfence,确认它在“All Security Options”里把XML-RPC关掉;如果没装,就别为了这一个功能专门去装个大插件。
- CDN层面拦截 —— 用Cloudflare的话,在防火墙规则里加一条
uri contains "xmlrpc.php"然后Block,这样请求到不了源站,省得浪费带宽。
长期维护建议:别以为禁了就一劳永逸
去年我帮一个朋友维护网站,发现他后台的“文章发布工具”失灵了,一查原因——他以前用插件禁用了XML-RPC,但后来换了个新主题,主题自带了一个类似pingback的功能,又偷偷把XML-RPC勾选开启了,所以长期维护要注意:
- 每次更新主题或插件后,都检查一下xmlrpc.php是否能访问,方法很简单:浏览器访问
你的域名/xmlrpc.php,如果返回“XML-RPC server accepts POST requests only”,说明还是活着的,赶紧再禁用。 - 定期看服务器访问日志,重点关注
xmlrpc.php的请求频率,正常站点一天可能有个几次,如果突然暴涨,哪怕你禁用了,也有可能是某个恶意脚本在打你其他入口。 - 别轻易给客户开XML-RPC,有些人说要远程发布文章方便,其实现在WordPress都有自己的REST API,完全替代XML-RPC,而且更安全,你图省事开了这个口子,将来出事背锅的还是你。
最后一句话
我见过太多人一被攻击就加钱买高防服务器,其实很多攻击就是冲着XML-RPC来的,把这个小文件管好,能省下你80%的防护精力,之前那个外贸客户,我给他禁掉XML-RPC后再没中过招,他还以为我装了多牛的安全系统——其实就是那一行代码的事儿。
做网站,少折腾花里胡哨的,把基础的口子堵严实了,比啥都强。
发表评论