2026年5月20日
2026年5月20日
WordPressのXML-RPCを無効化してセキュリティを高める方法
はじめに
XML-RPC(xmlrpc.php)はWordPressの古いリモートアクセスAPIです。現在はREST APIに置き換えられていますが、攻撃者にブルートフォース攻撃やDDoS増幅攻撃に悪用されます。使用していない場合は無効化するのが最善策です。
症状・原因
- サーバーログに
xmlrpc.phpへの大量アクセスが記録されている - Wordfenceから「XML-RPC経由のブルートフォース攻撃」の通知が届く
- xmlrpc.phpへのリクエストによるサーバー負荷が高い
- セキュリティスキャンで「XML-RPC有効」と指摘された
解決手順
ステップ1:XML-RPCを使用しているか確認する
# XML-RPC が有効か確認
curl -s -X POST https://example.com/xmlrpc.php \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>' | \
grep -o "methodName>[^<]*"
# 応答があれば XML-RPC は有効
# 403 または空応答なら無効化済み
# 使用しているプラグインの確認(XML-RPCを使うもの)
# Jetpack, WooCommerce, Wordfence, UpdraftPlus など
wp plugin list --format=table | grep -i "jetpack\|mobile"
ステップ2:functions.phpで無効化する
// functions.php: XML-RPC を完全に無効化
// ① xmlrpc.php へのアクセスを503で返す
add_filter('xmlrpc_enabled', '__return_false');
// ② XML-RPC のメソッドを全て削除
add_filter('xmlrpc_methods', function(array $methods): array {
return [];
});
// ③ system.multicall による一括攻撃をブロック
// (xmlrpc_enabled だけでは防げない場合に追加)
add_action('xmlrpc_call', function(string $method): void {
if ($method === 'system.multicall') {
wp_die(
'XML-RPC system.multicall は無効化されています。',
'XML-RPC Error',
['response' => 403]
);
}
});
ステップ3:.htaccessで完全ブロックする(推奨)
# .htaccess: xmlrpc.php への全アクセスをブロック
# PHP 処理自体をさせないのでサーバー負荷が最小
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
# または RewriteRule でブロック(Apache 2.4+)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^xmlrpc\.php$ - [F,L]
</IfModule>
# 設定後に確認
curl -I https://example.com/xmlrpc.php
# HTTP/1.1 403 Forbidden が返ること
# ブロックされているか詳細確認
curl -v https://example.com/xmlrpc.php 2>&1 | grep -E "< HTTP|< Server"
ステップ4:Nginxで無効化する
# /etc/nginx/sites-available/example.com
server {
# xmlrpc.php へのアクセスを拒否
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
}
ステップ5:Jetpackなど必要な場合の対応
// functions.php: Jetpack など特定のIPからのみXML-RPCを許可
add_filter('xmlrpc_enabled', function(bool $enabled): bool {
// Jetpack のサーバー IP(変更される可能性があるため要確認)
$jetpack_ips = [
'76.74.255.0/28',
'76.74.255.16/28',
'208.80.154.0/22',
'198.181.116.0/22',
];
$remote_ip = $_SERVER['REMOTE_ADDR'] ?? '';
foreach ($jetpack_ips as $range) {
[$subnet, $bits] = explode('/', $range);
if ((ip2long($remote_ip) & ~((1 << (32 - (int)$bits)) - 1))
=== ip2long($subnet)) {
return true; // Jetpack IP は許可
}
}
return false; // その他は拒否
});
# Jetpack を使用している場合の代替案:
# 1. Jetpack の REST API 接続に切り替える(推奨)
# → Jetpack の設定でREST API接続を有効にする
# 2. Jetpack なしの代替プラグインを使用する
# → WP Crontrol, UpdraftPlus(バックアップ)などは XML-RPC 不要
# XML-RPC を無効化しても影響しないプラグイン
wp plugin list --format=csv --fields=name,version | while IFS=, read name version; do
# XML-RPC 依存を確認(プラグインのソースコードを grep)
grep -r "xmlrpc\|XMLRPC" /var/www/html/wp-content/plugins/$name/ \
--include="*.php" -l 2>/dev/null
done
// functions.php: XML-RPC ログを記録して使用状況を把握する(無効化前の調査用)
add_action('xmlrpc_call', function(string $method): void {
error_log(sprintf(
'[XMLRPC] method=%s ip=%s ua=%s',
$method,
$_SERVER['REMOTE_ADDR'] ?? 'unknown',
$_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
));
});
// → /var/log/php_errors.log または error_log の設定先を確認
// 1週間記録してから xmlrpc_call が呼ばれているか確認
// 呼ばれていなければ安全に無効化できる
注意事項
- Jetpackを使用している場合、XML-RPCを完全にブロックするとJetpackの一部機能(統計・セキュリティスキャン等)が動作しなくなる可能性があります。JetpackはREST API接続も対応していますので、そちらへの移行を検討してください
- WordPressのモバイルアプリ(WordPress.com App)もXML-RPCを使用しています。アプリから投稿している場合は影響があります
xmlrpc_enabledフィルターでfalseを返しても、xmlrpc.phpへのHTTPリクエスト自体はサーバーに届きます。サーバー負荷を本当に減らすには.htaccessでファイルレベルでブロックするのが最善です
まとめ
XML-RPC無効化は①curl -X POSTで有効状態を確認、②add_filter('xmlrpc_enabled', '__return_false')でWordPressレベルで無効化、③.htaccessのでサーバーレベルでブロック(これが最も効果的)、④Jetpack使用時はJetpack IPからのみ許可するか REST API 接続に移行、⑤無効化前に1週間ログを記録して依存関係を確認します。