不正なログインの試しに使われやすい XML-RPC(xmlrpc.php)を止めるために、SiteGuard WP Plugin の「XML-RPC 防御」で「XML-RPC 無効化」を選んで保存しました。ところが、外から試すと、まだ XML-RPC が答えていました。
同じ設定を作業環境(ローカルの写し)で試すと、ちゃんと止まります。本番だけ止まらない理由は、調べた範囲では分かりませんでした。そこで、プラグインの動きに左右されない .htaccess で止めることにしました。止まっているかの確かめ方と、確かめるときの落とし穴もまとめます。
XML-RPC が止まっているかの確かめ方
ブラウザで https://(サイト)/xmlrpc.php を開くと「XML-RPC server accepts POST requests only.」と出ます。これは止まっていないという意味です。XML-RPC は POST で呼ぶものなので、ブラウザで開く(GET)だけでは、止まっているかどうか分かりません。
確かめるときは、POST で「使える命令の一覧(system.listMethods)」を聞いてみます。
ターミナルで試す(Mac・Linux)
curl -s -o /dev/null -w "%{http_code}\n" -X POST -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>' https://example.com/xmlrpc.php
Windows の PowerShell では、curl が別の命令(Invoke-WebRequest)になるので、curl.exe と打ってください。
- 200:XML-RPC が動いている(命令の一覧が返ってくる)
- 403:止まっている
ブラウザで開いたときの 405 や「POST requests only」は、XML-RPC が動いているときの返事です。止まっているかは POST の結果で見ます。
SiteGuard の設定だけで止まらなかったとき
SiteGuard WP Plugin(1.8 系)の「XML-RPC 無効化」は、WordPress の xmlrpc_enabled フィルターを無効にするのに加えて、XML-RPC のリクエストが来たら早い段階で 403 を返す作りになっています。作業環境ではこれで 403 になりました。
ただ、本番では設定を保存しても 200 のままでした。プラグインの読み込みを絞るプラグイン(plugin load filter)の古い版を疑いましたが、作業環境で同じ版にしても止まったので、これは原因ではありませんでした。
原因を探し続けるより、確実に止まる方法に切り替えました。
.htaccess で xmlrpc.php を止める
Web サーバー(Apache)の段階で xmlrpc.php へのアクセスを断ります。WordPress もプラグインも動く前に止まるので、プラグインの設定や読み込みの順番に左右されません。
.htaccess のいちばん上に足す(Apache 2.4)
# XML-RPC を止める
<Files xmlrpc.php>
Require all denied
</Files>
古い Apache(2.2)の書き方
<Files xmlrpc.php>
Order deny,allow
Deny from all
</Files>
- 「# BEGIN WordPress」〜「# END WordPress」の中には書かない(パーマリンクの設定を保存すると書き換えられるため)。いちばん上に書くのがおすすめです。
- SiteGuard なども .htaccess に書き込むので、上書きの前に今の .htaccess を控えておきます。
- 足したら、上の curl で 403 になるかを確かめます。トップページなど、ほかのページが開くことも見ます。
止める前に確かめること
XML-RPC を止めると、次のような XML-RPC を使う機能が使えなくなります。使っていないことを確かめてから止めます。
- スマホの WordPress アプリからの投稿
- Jetpack の一部の機能
- 外のサービスやツールから記事を投稿する仕組み(XML-RPC で投稿しているもの)
- ピンバック・トラックバック
最近の WordPress は REST API が使えるので、XML-RPC がなくても困らないことがほとんどです。
まとめ
- XML-RPC が止まっているかは、POST(system.listMethods)で確かめる。ブラウザで開いた結果(405)では分からない。
- プラグインの設定で止まらないときは、.htaccess の「<Files xmlrpc.php>」で止めると確実。
- 止める前に、XML-RPC を使う機能(アプリ・Jetpack・外からの投稿)を使っていないか確かめる。


