2026年8月9日
2026年8月9日
WordPressのXML-RPCがスキャンされているときの確認と無効化手順
アクセスログに POST /xmlrpc.php が大量に並んでいる場合、多くは自動化されたツールによるパスワードの総当たりや、ピンバック機能を悪用できるかの探りです。ただし、XML-RPCはJetpackや一部の外部アプリが今も使っている機能でもあるため、止める前に「自サイトで使っているか」を確認し、目的に合った方法を選ぶことが大切です。この記事では、ログの読み方、利用状況の確認、方法ごとに何が止まるのかの違い、無効化後の確認方法を説明します。
XML-RPCとは何か、今も何に使われているか
XML-RPCは、WordPressの外から記事の投稿や取得などを行うための仕組みで、サイトの直下にある xmlrpc.php が窓口です。REST APIが整う前から使われてきたもので、現在のブロックエディターや管理画面はREST APIを使っているため、XML-RPCを止めても通常の編集作業には影響しません。
一方で、次のような用途では今も使われていることがあります。
- Jetpack: WordPress.com とサイトの間の通信の一部にXML-RPCを使っています。止めると連携が切れたり、一部の機能が動かなくなったりします。
- スマートフォンのアプリや外部の投稿ツール: アプリやバージョンによって、XML-RPCで接続するものがあります。
- ピンバック: 他のブログからのリンク通知を受け取る機能で、XML-RPCの
pingback.pingを使います。
自サイトでこれらを使っていなければ、XML-RPCを止めても困ることはほとんどありません。
アクセスログでスキャンの状況を読む
まずアクセスログで、どこからどれくらい来ているかを確認します。ログの場所はサーバーによって異なり、レンタルサーバーでは管理画面からダウンロードする形式が多いです。VPSでNginxを使っている場合は、次のように送信元IPアドレスごとに数えられます。
grep "POST /xmlrpc.php" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
同じIPアドレスから短時間に数百件ある、複数のIPアドレスから同じ間隔で来ている、といった場合は自動化された攻撃と見てよいでしょう。ここで注意したいのが、ステータスコードの読み方です。XML-RPCは、ログインに失敗してもHTTPとしては200を返し、エラーの内容は応答の本文に入れて返します。そのため「200が並んでいる=侵入された」とは限りません。不正なログインが成功したかどうかは、管理画面のユーザー一覧に見覚えのないユーザーが無いか、記事が勝手に作られていないかで確認します。
また、XML-RPCには1回のリクエストで複数の処理をまとめて送る system.multicall があり、これを使うと少ないリクエスト数で多くのパスワードを試せます。WordPressは1回のリクエスト内で認証に失敗すると、以降の認証を打ち切る対策を入れていますが、xmlrpc.php が呼ばれるたびにPHPが動くため、サーバーの負荷にはなります。
自サイトでXML-RPCを使っているかを確認する
止める前に、次の点を確認します。
- 「プラグイン」画面でJetpackが有効になっていないか
- スマートフォンアプリや外部ツールから投稿している人がいないか(複数人で運用しているサイトでは担当者に確認する)
- アクセスログに、普段使っている連携サービスからの
xmlrpc.phpへのアクセスが無いか
使っている場合は、全体を止めるのではなく、ピンバックだけを止める、ログイン試行の制限を強めるなど、範囲を絞った対策を選びます。
方法ごとに何が止まるかの違い
XML-RPCの止め方はいくつかあり、止まる範囲が違います。違いを理解せずに選ぶと、「無効化したのにログが減らない」ということが起きます。
| 方法 | 止まるもの | 止まらないもの |
|---|---|---|
xmlrpc_enabled フィルター |
認証が必要な処理(投稿・ログインを伴う処理) | ピンバックなど認証不要の処理、xmlrpc.php へのアクセス自体 |
xmlrpc_methods で削除 |
削除した処理だけ(例: ピンバック) | それ以外の処理、アクセス自体 |
| サーバーでアクセス拒否 | xmlrpc.php へのすべてのアクセス |
なし(Jetpackなどの連携も止まる) |
名前から誤解されやすいのが xmlrpc_enabled フィルターです。このフィルターで止まるのは認証を伴う処理だけで、xmlrpc.php は引き続き応答し、PHPも動きます。ログの件数やサーバーの負荷を減らしたいなら、サーバー側でのアクセス拒否が必要です。
WordPress側で止める
テーマを変えても効果が続くよう、子テーマの functions.php か、mu-plugins に置いた独自のプラグインファイルに書きます。編集前にファイルのバックアップを取ってください。
認証が必要な処理を止め、あわせてピンバックの処理と、ピンバックの窓口を知らせる X-Pingback ヘッダーも外す例です。
// 認証が必要な XML-RPC の処理を止める
add_filter( 'xmlrpc_enabled', '__return_false' );
// ピンバック関連の処理を XML-RPC から外す
add_filter( 'xmlrpc_methods', function ( $methods ) {
unset( $methods['pingback.ping'] );
unset( $methods['pingback.extensions.getPingbacks'] );
return $methods;
} );
// 応答ヘッダーから X-Pingback を外す
add_filter( 'wp_headers', function ( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
} );
Jetpackを使っていて全体は止められない場合は、後半の2つ(ピンバック関連)だけを使う方法もあります。プラグインで設定したい場合は、SiteGuard WP Plugin や Wordfence Security などのセキュリティ系プラグインに、XML-RPCやピンバックを制限する設定があります。項目名や選べる範囲はバージョンによって変わるため、設定画面の説明を確認してください。
サーバー側でアクセスを拒否する
xmlrpc.php へのアクセスそのものを止めると、PHPが動く前に拒否されるため、負荷も減ります。Jetpackなどの連携は使えなくなる点に注意してください。
Nginxでは、serverブロックに次の location を追加します。URIが一字一句同じ場合だけに当たる location = の指定は、\.php$ の正規表現の location より優先されます。
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
編集後は sudo nginx -t で文法を確認してから sudo systemctl reload nginx で反映します。
Apache(2.4系)では、WordPressのフォルダーにある .htaccess に次を追加します。.htaccess はWordPressやプラグインも書き込むファイルなので、編集前に元のファイルをコピーしておき、# BEGIN WordPress から # END WordPress の間には書かないようにします。
<Files xmlrpc.php>
Require all denied
</Files>
レンタルサーバーによっては、管理画面のセキュリティ設定にXML-RPCへのアクセス制限の項目があり、国外からのアクセスだけを止めるといった設定ができる場合もあります。項目名や場所はサーバー会社ごとに異なります。
無効化できたかを確認する
設定後、手元のパソコンから curl で実際に送って確かめます。
curl -s -X POST -H "Content-Type: text/xml" \
--data '<?xml version="1.0"?><methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>dummy</value></param><param><value>dummy</value></param></params></methodCall>' \
https://example.com/xmlrpc.php
サーバー側で拒否していれば403が返ります。xmlrpc_enabled で止めている場合は、応答の本文に faultCode として405と、XML-RPCが無効になっている旨のメッセージが返ります。どちらでもなく、ユーザー名やパスワードが違うという内容の応答が返る場合は、設定が効いていません。
XML-RPCを止めると、総当たりの試行は wp-login.php に移ることがあります。ログイン試行回数の制限や、管理画面へのアクセス制限もあわせて検討してください。ここで紹介したフィルターや設定は、現行のWordPress・Nginx・Apacheで使えるものです(2026年10月現在)。
まとめ
POST /xmlrpc.phpの200は、ログイン成功を意味するとは限らない- 止める前に、Jetpack、アプリ、外部ツールで使っていないかを確認する
xmlrpc_enabledで止まるのは認証を伴う処理だけで、アクセスやPHPの負荷は残る- ピンバックだけ止めるなら
xmlrpc_methods、アクセスごと止めるならNginxのlocation =かApacheの<Files> - 設定後は
curlで応答を確かめ、ログイン画面の対策もあわせて行う