在WordPress中禁用XML-RPC暴力破解防护

如果您查看WordPress访问日志,您可能会发现每天有数百甚至数千个请求访问/xmlrpc.php。这是一种暴力破解攻击,黑客利用XML-RPC接口大规模测试用户名和密码组合,绕过正常的登录速率限制。

本指南解释了XML-RPC是什么、为何危险以及如何禁用它。

什么是XML-RPC?

XML-RPC是一个旧版协议,允许外部应用通过xmlrpc.php文件远程与WordPress交互。它最初是为WordPress移动应用和Jetpack等服务创建的,用于远程发布内容和管理网站。

如今,WordPress拥有更现代、更安全的REST API来处理这些任务。对大多数网站来说,XML-RPC已无必要,反而是不必要的攻击面。

XML-RPC为何危险?

XML-RPC存在三个主要攻击入口:

禁用前请检查:检查您是否使用了Jetpack、WordPress移动应用(iOS/Android)、ManageWP、InfiniteWP或任何依赖XML-RPC的第三方发布工具。如果使用了这些服务,请改用方法3(选择性禁用)。

方法1——通过.htaccess拦截(推荐)

此方法在网页服务器级别拦截对xmlrpc.php的请求,在PHP运行之前就阻止。这是最高效的方法,对WordPress资源的消耗为零。

将以下内容添加到您的.htaccess文件中(位于WordPress根目录,与wp-config.php同一目录):

# Block xmlrpc.php completely
<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

或者使用:

<IfModule mod_rewrite.c>
  RewriteRule ^xmlrpc\.php$ - [F,L]
</IfModule>

保存后,通过访问yoursite.com/xmlrpc.php进行测试——您应该看到403 Forbidden。

方法2——使用插件(最适合初学者)

如果您不想直接编辑.htaccess,可以使用以下插件之一:

方法3——通过functions.php选择性禁用

如果您需要为某些服务(如Jetpack)保留XML-RPC,但想拦截最危险的方法,可以使用此方法:

// Disable XML-RPC entirely (breaks Jetpack)
add_filter('xmlrpc_enabled', '__return_false');

// Or: just block pingback to prevent DDoS amplification
add_filter('xmlrpc_methods', function($methods) {
    unset($methods['pingback.ping']);
    unset($methods['pingback.extensions.getPingbacks']);
    return $methods;
});

将此内容添加到您子主题的functions.php文件中,或使用Code Snippets插件以避免直接修改主题文件。

推荐:对于大多数不使用Jetpack或WordPress移动应用的网站,方法1(.htaccess)是最佳选择——它是在服务器级别的完全拦截,PHP开销为零。

如何验证拦截是否生效

  1. 打开浏览器,访问https://yoursite.com/xmlrpc.php
  2. 如果看到403 Forbidden或404 Not Found——成功,已被拦截。
  3. 如果看到"XML-RPC server accepts POST requests only"——仍然处于活动状态。请重新检查上述步骤。

其他WordPress安全措施

禁用XML-RPC只是您应该采取的众多安全加固步骤之一。其他重要措施包括:

使用Fail2ban自动拦截xmlrpc.php攻击者

即使通过.htaccess拦截了xmlrpc.php,机器人仍会继续发送请求并在日志中产生噪音。Fail2ban实时读取您的访问日志,自动封禁违规IP地址,消除浪费的带宽。

在Ubuntu上安装Fail2ban

sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

为xmlrpc.php创建自定义过滤器

创建文件/etc/fail2ban/filter.d/wordpress-xmlrpc.conf:

[Definition]
failregex = ^<HOST> .* "POST /xmlrpc.php.*" (200|403|404|500) .*$
ignoreregex =

设置监狱规则

将以下内容添加到/etc/fail2ban/jail.local:

[wordpress-xmlrpc]
enabled  = true
port     = http,https
filter   = wordpress-xmlrpc
logpath  = /var/log/apache2/access.log
maxretry = 5
findtime = 60
bantime  = 3600

这将封禁在60秒内访问xmlrpc.php超过5次的IP地址,封禁时长1小时。将bantime = -1设置为对屡犯者实施永久封禁。应用更改:

sudo fail2ban-client reload
sudo fail2ban-client status wordpress-xmlrpc

XML-RPC与WordPress REST API:主要区别

禁用XML-RPC时的常见顾虑是失去远程API访问。好消息是:WordPress的现代REST API处理所有相同的使用场景——而且更安全。

功能 XML-RPC WordPress REST API
推出时间 WP 3.5(2012年) 完整版WP 4.7(2016年)
协议 XML over HTTP POST JSON over HTTPS(GET/POST/PUT/DELETE)
身份验证 请求体中的用户名+密码 应用密码、OAuth、JWT
安全风险 高(多调用、pingback滥用) 使用正确auth令牌时较低
状态 旧版——避免使用 当前标准(驱动Gutenberg)

REST API可通过/wp-json/wp/v2/访问,支持通过标准HTTP方法对文章、页面、用户、分类法等进行精细访问。如果某个第三方服务在2026年仍需要XML-RPC,值得检查是否存在REST API替代方案——大多数现代WordPress工具已经迁移。

检查访问日志中的xmlrpc.php攻击

在应用拦截之前或之后,了解您的网站受到多大程度的攻击是很有用的。在使用Apache的服务器上,通过SSH运行以下命令分析访问日志:

# Count total xmlrpc.php requests in the current log
grep "xmlrpc.php" /var/log/apache2/access.log | wc -l

# List the top attacking IP addresses
grep "xmlrpc.php" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

# Watch for new requests in real time
tail -f /var/log/apache2/access.log | grep xmlrpc

如果您看到每天对xmlrpc.php的请求超过100次——或者同一IP出现数百次——您的网站正在被主动攻击。立即应用.htaccess拦截,然后考虑使用Fail2ban或WAF规则将这些IP添加到封禁列表,在它们到达服务器之前就将其阻止。

具有企业级安全性的WordPress主机

AsiaGB主机包含Imunify360恶意软件防护和DirectAdmin,便于管理.htaccess。年费500泰铢起,配备SSD、PHP 8.3和Softaculous一键WordPress安装。

查看托管方案 →