前書き
なぜXML-RPCを停止するべきなのかの理由についてはこの記事では割愛しています。詳しい理由をご覧になりたい方は、WordPress の脆弱性とその対応をご覧ください。
XML-RPCを停止する方法としては大きく分けて3つあります。.htaccess
などで遮断する方法。サイトのテーマのfunctions.php
に停止するコードを書き込む方法。そして、プラグインを作り、そこに停止するコードを書き込む方法です。
自作以外のテーマを使っている場合、アップデートでfunctions.php
が上書きされてしまうリスクがあります。そのため、子テーマというものを作る必要があります。
しかし、停止するコードだけなら、ほかのテーマでも使いまわせるものですし、プラグインを作るほうを私はおすすめします。
XML-RPCを止めるプラグインの構造を作る
まずは、フォルダやファイルを作って外側を作っていきます。
フォルダ名はmycustom-example-noxmlrpc
として作ります。そして、ファイルはWordPressのプラグインのテンプレートを参考に、index.php
とmycustom-example-noxmlrpc.php
の2つを作ります。なお、index.phpのほうには動作するコードを書きません(<?php
とのみ記載します)。そして、mycustom-example-noxmlrpc.php
のほうには以下のコードを記入します。
<?php
/*
Plugin Name: mycustom example noxmlrpc
*/
add_filter('xmlrpc_enabled', '__return_false');
これだけでXML-RPCを無効化できます。add_filter
、xmlrpc_enabled
、それと__return_false
、Plugin Name
が何をしているかが気になる方はそれぞれリンク先の開発者リソースをご覧ください(英語)。
なお、実際に公式プラグインディレクトリに登録する際は、プラグインの名前が公式のものと被らないようにするなど、注意が必要な点がいくつかあります。詳細は、こちらをクリックして確認できます(英語)。
ここまでで、ファイル構造はこうなります:
/mycustom-example-noxmlrpc
index.php
mycustom-example-noxmlrpc.php
プラグインをインストールする
プラグインをインストールするために、上で作ったプラグインのフォルダをZIP圧縮してください。そのうえで、WordPressの管理画面からインストールします。
まず、/wp-admin/plugin-install.php?tab=upload
にアクセスします。すると、以下のような画面が表示されます。
そうしたら、「ファイルを選択」をクリックします。そして、作成したZIPファイルを選び「開く」等をクリックしてアップロードします。
うまくできていれば以下のような画面が出ます。
この画面が出たら、「プラグインを有効化」をクリックします。うまくいけば「プラグインを有効化しました。」と出て完了です。
XML-RPCが無効なことを確認をする
では、プラグインをインストールして有効化したところで実際に無効化されているのか確認しましょう。
下記のコマンドをシェルで実行してください。なお、URLは適宜置き換えてください。また、username
とpassword
はWordPressの管理画面にログインするためのパスワードを使います。
curl -X POST -H "Content-Type: application/xml" -d '<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>username</value></param>
<param><value>password</value></param>
</params>
</methodCall>' https://example.com/xmlrpc.php
きちんと無効化されていれば以下のような出力が返ってきます。(重要な部分を太文字にしています)
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>405</int></value>
</member>
<member>
<name>faultString</name>
<value><string>このサイト上では XML-RPC サービスが無効になっています。</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
うまく無効化できていない場合は下記のようなレスポンスが返ってきますので、再度確認してみてください。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><struct>
<member><name>isAdmin</name><value><boolean>1</boolean></value></member>
<member><name>url</name><value><string>https://example.com/</string></value></member>
<member><name>blogid</name><value><string>1</string></value></member>
<member><name>blogName</name><value><string>ブログタイトル</string></value></member>
<member><name>xmlrpc</name><value><string>https://example.com/xmlrpc.php</string></value></member>
</struct></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
まとめ
もちろん既存のプラグインディレクトリにあるプラグインを使っても問題ありません。ただ、XML-RPCを停止するだけであればプラグインを作るのも一つの選択肢です。皆さんもぜひ挑戦してみてください。