2026年5月20日

2026年5月20日

WordPressのREST APIへのアクセスを制限する方法

はじめに

WordPressのREST API(/wp-json/)はGutenbergや多くのプラグインが使用するため、完全無効化は非推奨です。しかし、未ログインユーザーへの公開が不要なエンドポイントは制限することで、情報漏洩やスパムコメントのリスクを低減できます。

REST APIのリスク

  • /wp-json/wp/v2/users でユーザー名・メールアドレスが公開される
  • 未認証でコンテンツが取得可能(非公開にしたいサイト向けに問題)
  • スパムボットがコメントエンドポイントを悪用する

解決手順

ステップ1:未ログインユーザーのAPIアクセスを制限

// functions.php
add_filter('rest_authentication_errors', function($result) {
    // すでにエラーまたは認証済みならそのまま返す
    if ($result !== null) return $result;

    // 未ログインユーザーのREST APIアクセスを拒否
    if (!is_user_logged_in()) {
        return new WP_Error(
            'rest_not_logged_in',
            '認証が必要です。',
            ['status' => 401]
        );
    }

    return $result;
});

注意: この設定はGutenbergも影響を受けるため、管理画面のログインが必要です。公開フロントエンドでREST APIを使うJavaScriptがある場合は対象エンドポイントのみ除外します。

ステップ2:ユーザー情報エンドポイントを削除

// /wp-json/wp/v2/users のアクセスを制限
add_filter('rest_endpoints', function($endpoints) {
    if (!is_user_logged_in()) {
        // ユーザー一覧・個別ユーザー情報を削除
        unset($endpoints['/wp/v2/users']);
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});

ステップ3:特定エンドポイントのみ制限

// コメント投稿エンドポイントを認証必須に
add_filter('rest_pre_dispatch', function($result, $server, $request) {
    $route = $request->get_route();

    // コメント投稿は認証必須
    if (strpos($route, '/wp/v2/comments') !== false
        && $request->get_method() === 'POST'
        && !is_user_logged_in()) {
        return new WP_Error(
            'rest_forbidden',
            '認証が必要です。',
            ['status' => 403]
        );
    }

    return $result;
}, 10, 3);

ステップ4:wp-json ディスカバリーを無効化

// REST APIのエンドポイントURLをHTMLヘッダーから削除
remove_action('wp_head',           'rest_output_link_wp_head',    10);
remove_action('template_redirect', 'rest_output_link_header',     11);
remove_action('xmlrpc_rsd_apis',   'rest_output_rsd');

これはエンドポイント自体を無効化するわけではなく、URLの自動公開を止めるだけです。

ステップ5:Nginxでレートリミット

# nginx.conf — REST APIへのリクエストを1秒5件に制限
limit_req_zone $binary_remote_addr zone=rest_api:10m rate=5r/s;

location /wp-json/ {
    limit_req zone=rest_api burst=10 nodelay;
}

サイトヘルスへの影響

REST APIを完全に無効化するとWordPressのサイトヘルスで警告が表示されます。制限方法はサイトヘルスを維持しながら保護を加える rest_authentication_errors フィルターが推奨です。

注意事項

  • Gutenberg(ブロックエディタ)はREST APIを使用するため、完全無効化すると管理画面が壊れます
  • WooCommerceなどのプラグインも独自のREST APIエンドポイントを追加しています
  • モバイルアプリやヘッドレスWordPress構成でREST APIを使用中の場合は制限前に確認が必要です

まとめ

REST APIは rest_authentication_errors フィルターで未ログインユーザーを弾きつつ、ユーザー情報エンドポイントを rest_endpoints フィルターで削除するのが安全かつ推奨の組み合わせです。Gutenbergへの影響を最小限に抑えながらセキュリティを強化できます。

お気軽にご相談ください

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