WordPress REST API:完全に無効化せず、ログアウト状態だけをブロックする理由

公正取引委員会の広告文 Ver 3.1
公正取引委員会の広告文 Ver 3.2(モバイル専用)

WordPress REST APIは、ログインしていない訪問者にもwp-jsonのアドレスからサイトのユーザー名を公開します。完全に無効化するとブロックエディターで保存できなくなる場合があるため、ログアウト状態のリクエストだけをブロックし、401レスポンスで確認する方法をまとめました。

1️⃣ WordPress REST APIとは:wp-jsonのアドレスと役割

WordPress REST APIは、投稿・固定ページ・ユーザーなどのサイトデータをJSON形式でやり取りするWordPressの標準機能で、サイトアドレスの後ろの/wp-json/以下で応答します。

/wp-json/以下のアドレスは[wp/v2/posts]・[wp/v2/pages]・[wp/v2/users]のようにデータの種類ごとに分かれており、その一つひとつをエンドポイントと呼びます。ブロックエディターも投稿を保存するときにこのアドレスへリクエストを送ります。

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

2️⃣ wp-jsonから見えるユーザー名

  • ↪️ ブロックする理由:users 401・作成者ページからも見える

[wp/v2/users]エンドポイントは、投稿を公開したユーザーごとに表示名とslugを返し、slugには初期設定でログインIDがそのまま入ります。テストサイトのhttps://testpilotweb.com/でも、管理者アカウントのslugとログインIDは同じでした。

ログインIDが知られると、攻撃者はパスワードさえ突き止めればログインでき、テストサイトのWordPressログイン画面にも2026年10月7日の1日だけで2,570回のブルートフォース攻撃が記録されました。

このアドレスをブロックしても、作成者ページのアドレス(/author/ID/)には同じIDがそのまま残ります。

3️⃣ 完全に無効化すると壊れるもの

  • ↪️ ブロックエディターの保存・MCPツール0個

WP REST APIをすべて無効にすると、まずブロックエディターでの保存が失敗するため、WordPressの最適化プラグインの一つであるPerfmattersも無効化の範囲を[Disable for Non-Admins]と[Disable When Logged Out]の2段階に分けています。投稿者や寄稿者のアカウントがあるサイトでは、[Disable for Non-Admins]でもそのアカウントの保存がブロックされます。

ログアウト状態だけをブロックしたサイトでも、claude.aiにMCPコネクターを接続すると、認証を終えた後にツールが0個と表示されました。サーバーログにはMCPのリクエストがすべて401として残っており、原因はPerfmattersがMCPのトークン確認より先にリクエストをブロックしたことでした。

[Disable REST API]の値ログアウト訪問者のusersアドレス管理者以外のアカウントの投稿保存向いているケース
Default (Enabled)ユーザー名が見える保存できる—
Disable for Non-Admins401保存に失敗投稿者・寄稿者アカウントがないサイト
Disable When Logged Out401保存できる投稿者アカウントがあるサイト。MCPなどトークン接続は例外パスを追加

4️⃣ ログアウト状態だけをブロックする設定(Perfmatters)

  • ↪️ 設定場所・401レスポンスの確認

WordPress管理画面の[設定] → [Perfmatters] → [General]で、[Core]項目の[Disable REST API]を[Disable When Logged Out]に変えて[Save Changes]を押します。

WordPress Settings → Perfmatters → General(WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

Perfmattersの対応言語:英語(標準)、韓国語、ドイツ語、フランス語、イタリア語、オランダ語、ポルトガル語(ブラジル)、ロシア語、ウクライナ語、トルコ語、ブルガリア語、ハンガリー語、インドネシア語、ペルシア語、中国語(簡体字)

Perfmatters settings simulator: General → Core
Perfmatters設定シミュレーター · Perfmattersレビュー・ガイド

ログインしていないシークレットウィンドウで/wp-json/wp/v2/usersを開くと、[Sorry, you do not have permission to make REST API requests.]というメッセージとともに401レスポンスが返り、ログインした状態のブロックエディターはそのまま投稿を保存できます。

🔌 同じリクエスト、2つのレスポンス GET /wp-json/wp/v2/users
ブロックしていないサイト
200
ログインしていない訪問者もユーザー名を確認できます。
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
[Disable When Logged Out]のサイト
401
ログインしていないリクエストには、メッセージとともに401レスポンスが返ります。
{
  "code": "rest_authentication_error",
  "message": "Sorry, you do not have permission to make REST API requests.",
  "data": { "status": 401 }
}
slug slugには初期設定でログインIDがそのまま入ります。
左側はレスポンスからid・name・slug・linkの4項目だけを抜き出したもので、名前は例(user_a)です。


5️⃣ ブロックしたパスに例外を設ける

  • ↪️ MCPパスの例外・REST APIリンク削除との違い

ブロックした状態で特定のパスだけを開ける必要があるときは、Perfmattersの[perfmatters_rest_api_exceptions]フィルターにそのパスを追加します。claude.ai MCPコネクターのツール0個の問題は、Perfmattersの[Code]メニューでPHPスニペットを作り、MCPのパスだけを例外にして解決しました。

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

例外を設けた後も、トークンのないリクエストはMCP自身が[MCP authentication required.]のメッセージと401レスポンスでブロックし、/wp-json/wp/v2/usersは引き続きPerfmattersの401レスポンスを返します。

🚦 リクエストが通る順番
例外を設ける前・MCPリクエスト
[Disable When Logged Out]の状態で、claude.ai MCPコネクターが認証を終えた後に送ったリクエストです。
Perfmatters
401でブロック
→↓
MCPトークン確認
到達しない
→↓
結果
ツール0個
例外を設けた後・MCPリクエスト
/mcp/mcp-oauth-server のパスをPerfmattersの例外に追加した状態です。
Perfmatters
例外パスなので通過
→↓
MCPトークン確認
MCPが自分で確認
→↓
結果
トークンがなければ401
[MCP authentication required.]
例外を設けた後・ /wp-json/wp/v2/users
例外に入れていないパスはそのままブロックされます。
Perfmatters
401でブロック
→↓
結果
ユーザー名の露出ブロックを維持
⚠️ PerfmattersはMCPのトークン確認より先にリクエストをブロックします。

同じ[Core]項目の[Remove REST API Links]は、ページのヘッダーとレスポンスヘッダーからapi.w.orgのリンクだけを削除する設定で、WP REST API自体はそのまま応答します。

🔢 FAQ & おすすめコンテンツ

xmlrpc.phpはREST APIとは別のアドレスなので、REST APIをブロックしてもそのまま応答します。テストサイトには2026年10月8日の1日だけでxmlrpc.phpへのPOSTリクエストが734回記録されており、Perfmattersでは同じ[Core]項目の[Disable XML-RPC]でブロックできます。

WP Rocketは/wp-json/のアドレスをキャッシュ除外リストに入れているため、REST APIのレスポンスは保存した時点ですぐに変わります。[Remove REST API Links]のようにページのHTMLが変わる設定は、キャッシュをクリアした後に反映されます。

いいえ。WordPressのブロックエディターは投稿を保存するときにREST APIへリクエストを送り、claude.aiのようなAIツールをつなぐMCPコネクターも/wp-json/以下のパスを使います。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 10   +   6   =