如果您查看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存在三个主要攻击入口:
- 多调用暴力破解——XML-RPC支持在单个请求中批量处理多个调用(
system.multicall)。攻击者可以在单个HTTP请求中测试数千个密码组合,轻松绕过基于IP的速率限制。 - 通过Pingback的DDoS放大——
pingback.ping方法可被滥用来让您的服务器向第三方目标发送请求,实际上将您的网站变成DDoS参与者,导致您的IP被列入黑名单。 - 远程内容注入——一旦获得凭据,攻击者可以通过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,可以使用以下插件之一:
- Disable XML-RPC——轻量级单一功能插件。免费,无需配置。
- Wordfence Security——包含XML-RPC拦截设置的完整安全套件。
- All-in-One Security (AIOS)——在"WordPress调整"下有"完全拦截XML-RPC"选项。
方法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开销为零。
如何验证拦截是否生效
- 打开浏览器,访问
https://yoursite.com/xmlrpc.php - 如果看到403 Forbidden或404 Not Found——成功,已被拦截。
- 如果看到"XML-RPC server accepts POST requests only"——仍然处于活动状态。请重新检查上述步骤。
其他WordPress安全措施
禁用XML-RPC只是您应该采取的众多安全加固步骤之一。其他重要措施包括:
- 重命名或限制对
/wp-admin登录页面的访问 - 为所有管理员账户启用双重身份验证(2FA)
- 使用Login LockDown等插件限制登录尝试次数
- 始终保持WordPress核心、主题和插件更新
- 安装Wordfence或Sucuri等安全插件
使用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安装。
查看托管方案 →