xmlrpc.php とは何ですか? WordPress で無効化するには?
執筆:Eureka Studio · 更新日
要点
XML-RPC を使うと、アプリは xmlrpc.php からログインできます。これは wp-login.php を隠しても塞がらない別の入口です。Jetpack や WordPress モバイルアプリを使っていなければ、無効にしても安全です。.htaccess でファイルをブロックするか、xmlrpc_enabled フィルターを追加するか、ピンバックを残したまま XML-RPC のログインを閉じるプラグインを使います。その後、結果をテストしてください。
手順
1手順 1
xmlrpc.php が応答するか確認する
yoursite.com/xmlrpc.php にアクセスします。「XML-RPC server accepts POST requests only.」と表示されたら、入口は開いています。
2手順 2
なぜ問題なのかを理解する
Hushfort の攻撃面スキャンは、実際に試してみます。開いているサイトでは、隠したログインパスを迂回してパスワードを試せること、そして system.multicall で 1 回のリクエストに数百回の試行を詰め込めることを報告します。

3手順 3
どこまで閉じるかを選ぶ
「Hushfort → 攻撃面の強化」を開き、「攻撃面の強化を有効化」をオンにします。XML-RPC は最初「ログインを無効化し、ピンバックは維持 (推奨)」になっており、ほとんどのサイトに適しています。「完全に無効化」は最も厳格ですが、Jetpack と公式モバイルアプリが使えなくなります。「変更を保存」を押します。

4手順 4
XML-RPC 経由のログインが拒否されることをテストする
「概要」に戻り、「再スキャン」を押します。XML-RPC の行が「ログインは無効です。パスワードの試行は拒否され、ピンバックは引き続き機能します。」になっていれば成功です。

なぜ重要なのか
XML-RPC は、WordPress を遠隔操作するための古いインターフェースです。REST API が登場する前は、デスクトップのエディターやモバイルアプリはこれを使って投稿を公開していました。今もすべての WordPress サイトに /xmlrpc.php として含まれており、リクエストごとにユーザー名とパスワードを受け付けます。
つまりこれは第二のログイン口です。wp-login.php を隠しても影響しません。ログインフォームだけを監視するログイン制限のコードには見えません。しかも system.multicall を使えば、1 回の HTTP リクエストに数百回のパスワード推測を詰め込めます。リクエスト数を数える制限には、500 回の試行が 1 回にしか見えません。
これは机上の空論ではありません。このレイヤーを作ったのは、ログインページをすでに隠していたのに、XML-RPC 経由でパスワードの試行を受け続けたあるストアがきっかけでした。
XML-RPC を使っていますか? 次のどれにも当てはまらなければ、おそらく使っていません:
- サイトを Jetpack に接続している。
- WordPress 公式モバイルアプリから投稿やコメントの管理をしている。
- 古いデスクトップのブログツールや、(アプリケーションパスワードではなく) WordPress のユーザー名とパスワードを求めて代わりに投稿するサービスを使っている。
- 他のブログからのピンバックを活用している。
わからなければ、ログインだけを閉じてピンバックは残しましょう。パスワード推測のリスクはなくなり、無害な部分はそのまま残ります。後からいつでも厳しくできます。
よくある間違い
- ログインを隠して終わりにする。 パスワードの推測が
xmlrpc.phpに移るだけです。 - 確認せずにファイル全体をブロックする。 Jetpack と WordPress 公式モバイルアプリは XML-RPC 経由で接続します。使っている場合は、ログイン用のメソッドだけを閉じるか、慎重にテストしてください。
- テストせずにスイッチを信用する。 方法によっては、XML-RPC の一部が応答し続けます。結果は必ず実際のリクエストで確認してください (ステップ 4、またはサイトが何を公開しているかを確認する方法を参照)。
- キャッシュ層を忘れる。 CDN のルールですでに
xmlrpc.phpをブロックしているなら、WordPress 側の設定には何の効果も見えません。それで問題ありません。どの層が働いているかを把握しておけば十分です。
プラグインを使わない方法
方法 1: xmlrpc_enabled フィルター。 小さな必須プラグイン (wp-content/mu-plugins/no-xmlrpc-login.php) か、子テーマの functions.php に次を追加します:
<?php
add_filter( 'xmlrpc_enabled', '__return_false' );
これでログインが必要な XML-RPC のメソッドが無効になります。ピンバックはログインを必要としないため、引き続き機能します。これだけでは system.multicall は削除されず、ファイルもリクエストに応答し続けます。multicall メソッドも削除するには:
<?php
add_filter( 'xmlrpc_methods', function ( $methods ) {
unset( $methods['system.multicall'] );
return $methods;
} );
方法 2: サーバーでファイルをブロックする。 Apache なら .htaccess に:
<Files xmlrpc.php>
Require all denied
</Files>
Nginx なら location = /xmlrpc.php { deny all; }。最も厳格な方法でサーバーの負荷もかかりませんが、ピンバック、Jetpack、モバイルアプリもすべて使えなくなります。また WordPress の外にあるため、サーバーを移転するときに忘れがちです。
うまくいかないときは
- Jetpack に接続エラーが表示される。 Jetpack には XML-RPC が必要です。「完全に無効化」から「ログインを無効化し、ピンバックは維持」に切り替えるか、サーバーのルールを削除してください。
- WordPress モバイルアプリでログインできない。 原因は同じです。モバイルではブラウザーを使うか、XML-RPC のログインを許可したうえでログイン制限と二要素認証に頼ってください。
- 投稿ツールが投稿できなくなった。 そのツールが XML-RPC を使っているか確認してください。最近のツールのほとんどは、アプリケーションパスワードを使う REST API に移行しています。
Hushfort なら
バックドアロックは 無料の WordPress セキュリティプラグイン Hushfort Security に追加する有料アドオン Hushfort Pro の機能です。XML-RPC が開いているかどうかを示す攻撃面スキャンは、無料版プラグインに含まれます。
バックドアロックは、Hushfort の「攻撃面の強化」レイヤーの一部です。選択肢は 4 つあります:
- ログインを無効化し、ピンバックは維持 (推奨): XML-RPC 経由のパスワード推測は不可能になり、ピンバックとトラックバックは引き続き機能します。ストアサイトに適しています。
- 完全に無効化: 最も厳格な選択肢です。Jetpack と公式モバイルアプリは接続できなくなります。
- system.multicall のみ無効化: 一括推測を塞ぎ、それ以外はそのままにします。
- 変更しない: WordPress のデフォルトです。
その後、攻撃面スキャンが実際のリクエストで結果を確認するので、外部から見えるものを確かめられます。負荷保護も xmlrpc.php へのリクエストを通常のページ表示より高く値付けするため、残ったノイズの勢いも弱まります。
よくある質問
WordPress で XML-RPC を無効にしても安全ですか?
ログインページを隠せば xmlrpc.php も隠れますか?
system.multicall とは何ですか?
XML-RPC を無効にするとピンバックは使えなくなりますか?
xmlrpc_enabled フィルターで XML-RPC は完全にオフになりますか?
関連するハウツー
WordPress サイトが外部に何を公開しているか、セキュリティチェックするには?
ボットと同じ 5 つのリクエストで WordPress をセキュリティチェック。ログイン画面、XML-RPC、ユーザー名の公開状況と塞ぎ方を解説します。
手順を読むWordPress でログイン試行回数を制限するにはどうすればいいですか?
WordPress でログイン試行回数を制限し、総当たり攻撃を止める方法。効果的な設定値、プラグインなしのコード、見落としがちな抜け道を解説します。
手順を読むWordPress のログイン URL を変更するには?
WordPress のログイン URL を変更して wp-admin を隠す 5 つの手順。ログアウト前のテストと、URL を忘れたときの戻り方も解説します。
手順を読む
