2026年5月20日

2026年5月20日

WordPressのXML-RPC(xmlrpc.php)を無効にする方法とリスク・Jetpack利用時の注意

XML-RPC は、外部のアプリやサービスが WordPress に投稿・取得などの操作をするための古い仕組みで、窓口はサイト直下の xmlrpc.php です。WordPress 3.5 以降は初期状態で有効になっていて、管理画面から切り替える設定はありません。

現在は REST API とアプリケーションパスワードで同じことができるため、XML-RPC を使うサービスが無いサイトでは、止めることで攻撃の入り口を1つ減らせます。

XML-RPC で起きる問題

  • パスワードの総当たりに使われる。 xmlrpc.php はユーザー名とパスワードを受け取ってログインできるため、ログイン画面(wp-login.php)だけを守る対策をすり抜けて試行されることがあります。system.multicall で1回のリクエストに複数のログイン試行を詰め込む手口もありますが、WordPress 4.4 以降は、同じリクエスト内で1回失敗すると残りの試行はすべて失敗扱いになります。
  • ピンバックの悪用。 pingback.ping は、指定された URL にサイトがアクセスしに行く機能です。これを大量に送らせて、第三者のサイトへの攻撃の踏み台にされることがあります。
  • サーバーの負荷。 攻撃のリクエストでも、そのたびに WordPress 全体が読み込まれるため、PHP の処理が増えます。

止める前に、XML-RPC を使うものが無いか確かめる

使っているもの XML-RPC との関係
Jetpack WordPress.com との接続に XML-RPC を使う。xmlrpc.php を止めると接続が切れる
WordPress モバイルアプリ(iOS / Android)で自分のサーバーのサイトを管理している XML-RPC を使う場合がある。止めた後にアプリから接続・投稿できるか確かめる
他のブログからのピンバックを受け付けたい pingback.ping が必要
外部の投稿ツール・連携サービス サービスごとに確認する。REST API とアプリケーションパスワードに対応していれば、そちらに切り替える

どれも使っていなければ、xmlrpc.php そのものへのアクセスを止める方法(方法1・方法2)が一番簡単で、サーバーの負荷も減ります。

方法1: Apache(.htaccess)で止める

WordPress をインストールしたディレクトリーの .htaccess に追加します。WordPress が書き込む # BEGIN WordPress 〜 # END WordPress の外(前)に置いてください。

# xmlrpc.php へのアクセスをすべて拒否(Apache 2.4)
<Files "xmlrpc.php">
    Require all denied
</Files>

Order Deny,Allow と Deny from all は Apache 2.2 の書き方です。Apache 2.4 では mod_access_compat が無いと 500 エラーになるため、Require を使います。

アクセスすると 403 Forbidden が返るようになります。

Jetpack を使う場合は、Jetpack の IP アドレスだけ許可する

Jetpack のサポートページでは、Jetpack のサーバーの IP アドレス範囲からだけ xmlrpc.php を許可し、それ以外を拒否する方法が案内されています。2026年11月時点の範囲で書くと次のとおりです。

<Files "xmlrpc.php">
    Require ip 122.248.245.244/32 54.217.201.243/32 54.232.116.4/32
    Require ip 192.0.80.0/20 192.0.96.0/20 192.0.112.0/20
    Require ip 195.234.108.0/22 192.0.64.0/18
</Files>

この範囲は変わることがあります。最新の一覧は Jetpack のサイトの https://jetpack.com/ips-v4.txt で公開されているので、定期的に照らし合わせてください。また、Cloudflare などのプロキシーを通している場合、Apache から見える接続元はプロキシーの IP アドレスになるため、この方法はそのままでは使えません。

方法2: Nginx で止める

サイトの server ブロックに追加します。

location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
}

location = の完全一致は、location ~ \.php$ のような正規表現の location より優先されるため、書く順番は問いません。設定を確認して読み込み直します。

sudo nginx -t
sudo systemctl reload nginx

Jetpack を使う場合は、deny all; の前に allow 192.0.64.0/18; のように Jetpack の範囲を1行ずつ書きます。

方法3: PHP で止める(サーバーの設定を変えられない場合)

共用サーバーで .htaccess を使えない場合などは PHP で止めます。テーマを変えても効くように、functions.php ではなく wp-content/mu-plugins/ に置くプラグイン(mu-plugin)にします。フォルダーが無ければ作り、次のファイルを wp-content/mu-plugins/disable-xmlrpc.php として保存します。

<?php
/*
 * Plugin Name: Disable XML-RPC
 */

// xmlrpc.php へのリクエストなら 403 を返して終了する
if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
    status_header( 403 );
    header( 'Content-Type: text/plain; charset=utf-8' );
    exit( 'XML-RPC is disabled.' );
}

// 通常のページのレスポンスヘッダーから X-Pingback を消す
add_filter( 'wp_headers', function ( $headers ) {
    unset( $headers['X-Pingback'] );
    return $headers;
} );

xmlrpc.php は WordPress を読み込む前に定数 XMLRPC_REQUEST を定義するので、mu-plugin の時点で判定できます。ただし WordPress の読み込み自体は行われるため、負荷を減らす効果は方法1・方法2より小さくなります。

xmlrpc_enabled フィルターについて

よく紹介される次のコードは、XML-RPC 全体を止めるものではありません。

add_filter( 'xmlrpc_enabled', '__return_false' );

WordPress のソースコードの説明にあるとおり、このフィルターが止めるのはログインが必要なメソッド(投稿の作成・取得など)だけで、ピンバックなどログイン不要のメソッドは動き続けます。パスワードの総当たりは防げますが、ピンバックの悪用と負荷は残ります。

方法4: ピンバックだけ止める(Jetpack やアプリは使い続ける場合)

XML-RPC 自体は残し、ピンバックのメソッドだけを外します。上と同じように mu-plugin に書きます。

<?php
/*
 * Plugin Name: Disable Pingback Methods
 */

add_filter( 'xmlrpc_methods', function ( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

add_filter( 'wp_headers', function ( $headers ) {
    unset( $headers['X-Pingback'] );
    return $headers;
} );

X-Pingback は、ピンバックを受け付ける投稿を表示したときに WordPress が送るレスポンスヘッダーです。テーマによっては HTML の head に rel="pingback" のリンクを出力するので、その場合はテーマ側の出力も確認してください。

止まったか確かめる

example.com を自分のドメインに置き換えて実行します。

# ステータスコードだけを表示
curl -s -o /dev/null -w "%{http_code}\n" -X POST https://example.com/xmlrpc.php
結果 状態
403 方法1〜3で止まっている
200 XML-RPC は動いている
405 GET で確かめた場合の応答。XML-RPC は動いている(本文は XML-RPC server accepts POST requests only.)

方法4でピンバックが外れたかは、使えるメソッドの一覧で確かめます。

curl -s -X POST -H "Content-Type: text/xml" \
  -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>' \
  https://example.com/xmlrpc.php | grep pingback

何も表示されなければ、ピンバックのメソッドは外れています。

注意すること

  • 止めた後に Jetpack の接続エラーが出た場合は、Jetpack の IP アドレスを許可するか、止める方法を方法4に切り替えます。
  • サーバー会社によっては、最初から xmlrpc.php へのアクセスを制限していることがあります。その場合は、サーバー会社の管理画面の設定を確認してください。
  • XML-RPC を止めても、wp-login.php への総当たりは別に対策が必要です。

まとめ

  • XML-RPC を使うものが無ければ、Apache の Require all denied か Nginx の deny all で xmlrpc.php へのアクセスを止めるのが簡単です。
  • xmlrpc_enabled フィルターはログインが必要なメソッドだけを止め、ピンバックは止めません。
  • Jetpack を使う場合は、Jetpack の IP アドレスだけを許可するか、ピンバックだけを外します。

外部サービスから投稿する仕組みを REST API に切り替える場合は アプリケーションパスワード、ログイン画面の守り方は ブルートフォース攻撃への対策 を参考にしてください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲