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への影響を最小限に抑えながらセキュリティを強化できます。