Webサイトのお助け隊

XML-RPCを無効化した場合の代替手段としてのWordPress REST APIの活用

20 views
約20分

スマホアプリが突然使えなくなって、マジで焦った話

結論から言っちゃうと、XML-RPCを無効化しても、REST APIがあれば全然問題ない。っていうか、むしろセキュリティが上がるし、開発の自由度も増すから、無効化した方がいいと僕は思ってる。

あれは確か、去年の夏だったかな。いや、もしかしたら秋だったかもしれない。まあ、そのへんはどうでもいいんだけど。クライアントのサイトでセキュリティ対策をやってて、XML-RPCを無効化したんだよね。で、その数日後。クライアントから電話がかかってきた。「スマホのアプリで記事が投稿できなくなったんですけど、何かしました?」って。

最初は「え?そんなはずないけどな」って思ったんだけどね。だって、最新のWordPressアプリはREST API使ってるはずだし。でも、よくよく調べてみたら、そのクライアント、古いバージョンのWordPressアプリを使ってたんだよ。これが問題だった。

古いアプリってXML-RPCに依存してたから、無効化したら動かなくなっちゃうわけ。正直、これは僕の確認不足だったと思う。事前にアプリのバージョンを確認しておけばよかった。

でも、最新版のアプリはREST APIを使ってる。だからアプリを更新してもらったら、すぐに解決した。ホッとしたよ、本当に。クライアントにも「すみません、事前に確認しておくべきでした」って謝った。

この経験で学んだのは、XML-RPCを無効化する前に、何がXML-RPCに依存してるのか確認することの大切さ。当たり前のことなんだけど、忙しいとつい忘れちゃうんだよね。あと、REST APIがどれだけ優れた代替手段なのかってことも、改めて実感した。

今回は、XML-RPCを無効化した後に、REST APIをどう活用すればいいのか、具体的な方法を紹介していく。僕の失敗談も含めて、できるだけリアルに書いていくつもり。

XML-RPCって何?なぜ無効化すべきなの?

まず、XML-RPCについて簡単に説明しておこう。っていうか、これ知らない人も結構いるんじゃないかな。

XML-RPCは、WordPressと他のシステムが通信するための仕組み。HTTPで転送して、XMLでエンコードする。WordPressのルートディレクトリにxmlrpc.phpってファイルがあるんだけど、それがXML-RPCの本体なんだ。

WordPress 3.5以降、XML-RPCはデフォルトで有効になってる。これは、WordPressのモバイルアプリがサイトと通信できるようにするため。便利なんだけど、セキュリティ的には問題がある。これが厄介なんだよね。

XML-RPCの主な用途

XML-RPCは、こんなことに使われてきた。っていうか、今でも使われてるサイトは結構ある。

まず、WordPressモバイルアプリとの通信。スマホアプリから記事を投稿したり、編集したりするのに使われてた。これは便利だったんだけど、セキュリティリスクもあった。

次に、他のブログプラットフォーム間の通信。トラックバックとかピンバック機能ね。これは今ではあまり使われなくなったけど、一時期は結構流行ってた。僕も昔は使ってたな。

あと、Jetpackプラグインの連携。WordPress.comとの連携に使われてる。Jetpack使ってる人は多いから、これは注意が必要。

これらの機能は便利なんだけど、XML-RPCには深刻なセキュリティリスクがあるんだ。これが問題なんだよね。

XML-RPCのセキュリティリスク

XML-RPCの最大の問題は、セキュリティ脆弱性。これはマジで怖い。

まず、DDoS攻撃のリスクがある。ハッカーがxmlrpc.phpを悪用して、短時間に大量のピンバックを送信できちゃう。サーバーに過度な負荷がかかって、サイトが停止する可能性がある。実際、僕が管理してるサイトでも、これで落ちたことがある。あの時は本当に焦った。

次に、ブルートフォース攻撃のリスク。XML-RPCはリクエストごとにユーザー名とパスワードを送信する仕組みになってるんだ。これがハッカーに利用されて、総当たり攻撃で正しい認証情報を割り出されちゃう可能性がある。

僕が過去に対応した案件で、XML-RPCを狙ったブルートフォース攻撃を受けてたサイトがあった。サーバーのログを見たら、xmlrpc.phpへのアクセスが数万回も記録されてた。正直、ゾッとしたよ。幸い、パスワードは破られなかったけど、サーバーの負荷が上がってサイトの表示速度が遅くなってた。あれは本当に怖かったな。クライアントにも「すぐに対策しましょう」って提案した。

こういったリスクがあるから、XML-RPCは無効化すべきなんだ。でも、無効化すると困る機能もある。そこで登場するのがREST API。これが救世主なんだよね。

REST APIとは何か

REST APIは、XML-RPCの後継として開発された、WordPressと外部システム間の通信規格。WordPress 4.7以降、本体に実装されてる。これは本当に画期的だった。

REST(Representational State Transfer)は、ウェブシステムが連動するための標準。統一されたインターフェース、クライアントサーバーの分離、ステートレス設計などの原則により、XML-RPCよりも柔軟で、セキュアで、拡張性が高い。っていうか、もう全然レベルが違う。

REST APIの利点

REST APIには、XML-RPCと比較して、いくつかの大きな利点がある。っていうか、利点しかないと言ってもいいかもしれない。

セキュリティの向上: REST APIは、OAuthによる認証を採用してる。ユーザー名とパスワードを直接送信する代わりに、トークンを使って認証する。これにより、認証情報が漏洩するリスクが大幅に減る。これは本当に大きい。僕も最初にREST APIを使った時、「これはすごいな」って思った。

柔軟性: REST APIは、JSONを使用した標準的なAPI。XML-RPCよりも対応範囲が広くて、さまざまなシステムやサービスと連携できる。開発の自由度が全然違うんだよね。これは開発者としてはすごくありがたい。

パフォーマンス: REST APIは、ステートレスな設計になってる。サーバーの負荷が軽減されて、レスポンスが速くなる。体感でも分かるレベルで速い。クライアントにも「速くなりましたね」って言われることが多い。

開発のしやすさ: REST APIは、標準的なHTTPメソッド(GET、POST、PUT、DELETE)を使う。開発者にとって馴染みやすくて、実装が容易。これは開発者としてはすごくありがたい。っていうか、これがなかったら、もっと大変だったと思う。

REST APIの基本的な使い方

REST APIを使うには、まず基本的な概念を理解する必要がある。っていうか、これが分かってないと、使いこなせない。

HTTPメソッド

REST APIは、4つの主要なHTTPメソッドを使う。これは覚えておいた方がいい。

GET: データを取得する。投稿一覧を取得したり、特定の投稿を取得したりする時に使う。これは一番よく使う。

POST: 新しいデータを追加する。新しい投稿を作成する時に使う。これも頻繁に使う。

PUT: 既存のデータを更新する。投稿の内容を変更する時に使う。これはたまに使う。

DELETE: データを削除する。投稿を削除する時に使う。これはあまり使わないけど、知っておいた方がいい。

これらのメソッドを使って、WordPressのコンテンツを操作する。シンプルでしょ?最初は難しく感じるかもしれないけど、慣れれば簡単。

エンドポイント

REST APIは、「エンドポイント」と呼ばれるURLを使ってアクセスする。これが分かってないと、REST APIは使えない。

例えば、投稿一覧を取得するエンドポイントはこんな感じ。

https://example.com/wp-json/wp/v2/posts

特定の投稿を取得する場合は、投稿IDを指定する。

https://example.com/wp-json/wp/v2/posts/123

エンドポイントの構造は、こうなってる。

  • ベースURL: https://example.com/wp-json/
  • ネームスペース: wp/v2/
  • リソース: posts

この構造を理解しておくと、REST APIの使い方がぐっと分かりやすくなる。僕も最初は混乱したけど、慣れれば簡単だった。

認証方法

REST APIを使って投稿を作成したり、更新したりするには、認証が必要だ。これは当たり前なんだけど、意外と忘れがち。

REST APIは、いくつかの認証方法をサポートしてる。

Cookie認証: WordPressの管理画面にログインしてる状態で、REST APIを使う場合に使われる。主にJavaScriptから使う時に便利。これは簡単だけど、セキュリティ的にはちょっと弱い。

Application Passwords: WordPress 5.6以降で追加された機能。ユーザーごとにアプリケーション専用のパスワードを生成できる。これが一番簡単で安全。僕もこれを一番よく使う。

OAuth: より高度なセキュリティが必要な場合に使う。プラグインを使って実装する。これは設定が面倒だけど、セキュリティは最高レベル。

僕がよく使うのは、Application Passwords。設定が簡単で、セキュリティも十分。クライアントにも「これが一番おすすめです」って言ってる。

REST APIの具体的な活用例

ここからは、REST APIの具体的な活用例を紹介していく。っていうか、これが一番知りたいところだと思う。

モバイルアプリからの投稿

最新のWordPressモバイルアプリは、REST APIを使ってる。だから、XML-RPCを無効化しても、モバイルアプリから記事を投稿できる。これは本当に便利。

アプリを最新版にアップデートするだけで、REST APIに対応する。特別な設定は不要。これは本当に楽。クライアントにも「アプリを更新してください」って言うだけで済む。

外部サービスとの連携

REST APIを使えば、WordPressと外部サービスを簡単に連携できる。これは本当に便利なんだよね。

例えば、ZapierIFTTTといった自動化サービスと連携して、特定のイベントが発生したら自動的に投稿を作成する、といったことができる。これは本当に便利。

僕が最近やったのは、Googleスプレッドシートに入力したデータを、自動的にWordPressの投稿として公開する仕組み。クライアントがスプレッドシートに慣れてたから、これがすごく喜ばれた。「これは便利ですね!」って言われて、僕も嬉しかった。

カスタムアプリケーションの開発

REST APIを使えば、WordPressをバックエンドとして、カスタムアプリケーションを開発できる。これは本当に自由度が高い。

例えば、ReactやVue.jsを使ったフロントエンドアプリケーションを作って、WordPressのコンテンツを表示する。これをヘッドレスCMSって呼ぶんだけど、最近すごく人気がある。僕も最近、これにハマってる。

僕も最近、ReactでWordPressのコンテンツを表示するアプリを作った。REST APIを使えば、WordPressのコンテンツを簡単に取得できるから、開発がすごくスムーズだった。クライアントにも「こんなこともできるんですね」って驚かれた。

投稿の一括管理

REST APIを使えば、複数の投稿を一括で管理できる。これは本当に便利なんだよね。

例えば、特定のカテゴリーの投稿を一括で取得して、タイトルを変更する、といったことができる。これは手動でやると時間がかかるけど、REST APIを使えば一瞬。本当に楽。

僕が過去にやったのは、古い投稿のカテゴリーを一括で変更する作業。数百件の投稿があったんだけど、REST APIを使ったスクリプトを書いたら、数分で完了した。クライアントにも「早いですね!」って驚かれた。

REST APIを使った投稿の作成例

ここからは、REST APIを使って投稿を作成する具体的なコード例を紹介する。これは実際に使えるコードだから、参考にしてほしい。

JavaScriptでの投稿作成

JavaScriptを使って、REST APIで投稿を作成する例。これは一番よく使うパターン。

// Application Passwordsを使った認証
const username = 'your-username';
const password = 'your-application-password';
const credentials = btoa(`${username}:${password}`);

// 投稿データ
const postData = {
  title: '新しい投稿のタイトル',
  content: '投稿の本文です。',
  status: 'publish'
};

// REST APIにPOSTリクエストを送信
fetch('https://example.com/wp-json/wp/v2/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Basic ${credentials}`
  },
  body: JSON.stringify(postData)
})
.then(response => response.json())
.then(data => {
  console.log('投稿が作成されました:', data);
})
.catch(error => {
  console.error('エラーが発生しました:', error);
});

このコードを実行すると、新しい投稿が作成される。シンプルでしょ?僕も最初にこれを見た時、「こんなに簡単なんだ」って思った。

PHPでの投稿作成

PHPを使って、REST APIで投稿を作成する例。これもよく使う。

<?php
// Application Passwordsを使った認証
$username = 'your-username';
$password = 'your-application-password';
$credentials = base64_encode("$username:$password");

// 投稿データ
$post_data = array(
    'title' => '新しい投稿のタイトル',
    'content' => '投稿の本文です。',
    'status' => 'publish'
);

// REST APIにPOSTリクエストを送信
$ch = curl_init('https://example.com/wp-json/wp/v2/posts');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    "Authorization: Basic $credentials"
));

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
echo '投稿が作成されました: ' . $data['id'];
?>

PHPでも同じように簡単に投稿を作成できる。これは本当に便利。

Pythonでの投稿作成

Pythonを使って、REST APIで投稿を作成する例。これも最近よく使う。

import requests
import base64

# Application Passwordsを使った認証
username = 'your-username'
password = 'your-application-password'
credentials = base64.b64encode(f'{username}:{password}'.encode()).decode()

# 投稿データ
post_data = {
    'title': '新しい投稿のタイトル',
    'content': '投稿の本文です。',
    'status': 'publish'
}

# REST APIにPOSTリクエストを送信
response = requests.post(
    'https://example.com/wp-json/wp/v2/posts',
    json=post_data,
    headers={
        'Content-Type': 'application/json',
        'Authorization': f'Basic {credentials}'
    }
)

data = response.json()
print(f'投稿が作成されました: {data["id"]}')

Pythonでも同じように簡単。どの言語でも使えるのがREST APIの良いところ。僕も最近はPythonをよく使ってる。

REST APIのセキュリティ対策

REST APIを使う時は、セキュリティ対策も忘れちゃいけない。これは本当に大事。

Application Passwordsの使用

REST APIで認証する時は、Application Passwordsを使うのがおすすめ。これは本当に便利で安全。

Application Passwordsは、WordPress 5.6以降で追加された機能。ユーザーごとにアプリケーション専用のパスワードを生成できる。これは本当に便利なんだよね。

メインのパスワードを使わないから、セキュリティが向上する。万が一、Application Passwordsが漏洩しても、すぐに無効化できる。これは本当に安心。

REST APIのエンドポイントを制限

REST APIのエンドポイントを制限することで、セキュリティを向上できる。これは結構重要。

例えば、特定のエンドポイントを無効化したり、特定のユーザーだけがアクセスできるようにしたりする。これは結構効果的。

functions.phpに以下のコードを追加すると、ユーザー情報のエンドポイントを無効化できる。

add_filter('rest_endpoints', function($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});

これで、外部からユーザー情報を取得されるリスクが減る。これは本当に大事。

HTTPSの使用

REST APIを使う時は、必ずHTTPSを使おう。これは基本中の基本。

HTTPSを使えば、通信が暗号化されて、認証情報が漏洩するリスクが減る。これは本当に大事。っていうか、今どきHTTPSを使ってないサイトは信用できない。

セキュリティプラグインの活用

Wordfence SecurityやiThemes Securityといったセキュリティプラグインを使えば、REST APIのセキュリティを強化できる。これは本当におすすめ。

これらのプラグインは、REST APIへの不正なアクセスを検知して、ブロックしてくれる。僕も必ず入れてる。クライアントにも「これは入れておいた方がいいですよ」って言ってる。

XML-RPCを無効化する方法

ここからは、XML-RPCを無効化する具体的な方法を紹介する。これは結構簡単。

プラグインを使った無効化

一番簡単なのは、プラグインを使う方法。これは本当に楽。

Disable XML-RPCというプラグインを使えば、ワンクリックでXML-RPCを無効化できる。設定も不要。インストールして有効化するだけ。これが一番簡単で確実。僕もこれをよく使う。

.htaccessを使った無効化

.htaccessファイルを編集して、XML-RPCを無効化することもできる。これはちょっと上級者向け。

.htaccessファイルに以下のコードを追加する。

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

これで、xmlrpc.phpへのアクセスがブロックされる。これは結構効果的。

functions.phpを使った無効化

functions.phpに以下のコードを追加して、XML-RPCを無効化することもできる。これも簡単。

add_filter('xmlrpc_enabled', '__return_false');

これで、XML-RPCが無効化される。シンプルでしょ?僕もこれをよく使う。

XML-RPCを無効化した後の確認事項

XML-RPCを無効化した後は、いくつか確認しておくべきことがある。これは結構大事。

モバイルアプリの動作確認

まず、WordPressモバイルアプリが正常に動作するか確認しよう。これは必須。

最新版のアプリを使ってれば、REST APIで動作するから問題ない。でも、念のため確認しておくと安心。僕も必ず確認してる。

Jetpackの動作確認

Jetpackプラグインを使ってる場合は、動作を確認しよう。これも大事。

JetpackはXML-RPCを使ってWordPress.comと連携してる。XML-RPCを無効化すると、Jetpackの一部機能が使えなくなる可能性がある。ただ、最近のJetpackはREST APIにも対応してるから、大抵は問題ない。でも、念のため確認しておいた方がいい。

トラックバック・ピンバックの確認

トラックバックやピンバック機能を使ってる場合は、動作を確認しよう。これはあまり使われてないけど。

これらの機能はXML-RPCに依存してるから、無効化すると使えなくなる。でも、今ではあまり使われてない機能だから、無効化しても問題ないことが多い。僕も最近はほとんど使ってない。

よくある質問

Q1: XML-RPCを無効化すると、WordPressモバイルアプリは使えなくなりますか?

最新版のWordPressモバイルアプリは、REST APIを使ってるから、XML-RPCを無効化しても問題なく使える。これは本当に便利。

ただし、古いバージョンのアプリを使ってる場合は、XML-RPCに依存してる可能性がある。アプリを最新版にアップデートすれば解決する。これは簡単。

Q2: REST APIを使うには、特別な設定が必要ですか?

WordPress 4.7以降、REST APIは本体に実装されてるから、特別な設定は不要。これは本当に楽。

ただし、投稿を作成したり更新したりするには、認証が必要。Application Passwordsを使うのがおすすめ。これは簡単で安全。

Q3: REST APIのセキュリティは大丈夫ですか?

REST APIは、OAuthやApplication Passwordsといった認証方法を採用してるから、XML-RPCよりもセキュア。これは本当に安心。

ただし、HTTPSを使ったり、セキュリティプラグインを活用したりして、さらにセキュリティを強化することが大事。これは忘れちゃいけない。

まとめ

XML-RPCを無効化しても、REST APIがあれば全然問題ない。っていうか、むしろセキュリティが上がるし、開発の自由度も増すから、無効化した方がいいと僕は思ってる。

REST APIは、XML-RPCの後継として開発された、WordPressと外部システム間の通信規格。OAuthによる認証、JSONを使用した標準的なAPI、ステートレスな設計など、XML-RPCよりも優れた特徴を持ってる。これは本当にすごい。

モバイルアプリからの投稿、外部サービスとの連携、カスタムアプリケーションの開発など、REST APIの活用例は多岐にわたる。これは本当に便利。

XML-RPCを無効化する時は、プラグインを使うのが一番簡単。無効化した後は、モバイルアプリやJetpackの動作を確認しておこう。これは忘れちゃいけない。

REST APIを活用して、セキュアで柔軟なWordPressサイトを構築してほしい。僕も引き続き、REST APIを使っていくつもり。

WordPressのセキュリティ、不安に思っていませんか?

「自分のサイトは大丈夫だろうか…」
「何から手をつければいいか分からない…」

もしあなたが少しでもそう感じているなら、専門家によるセキュリティ診断を受けてみることを強くお勧めします。

>> WordPressセキュリティ無料診断はこちら

上記のサイトでは、WordPressのプロがあなたのサイトの脆弱性を無料で診断してくれます。問題が見つかれば、具体的な対策方法についてもアドバイスをもらえます。手遅れになる前に、一度プロの目でチェックしてもらい、安心を手に入れましょう。

FacebookでシェアTwitterでシェアPinterestでシェア