【WordPressセキュリティ】ユーザー名(ID)の漏えいを防ぐ!「?author=1」と「wp-json」の2大抜け穴をブロックする方法

パスワードだけ強化しても、ユーザー名がバレていたら意味がない

WordPressのセキュリティ対策として、多くの方がまず取り組むのが「パスワードを強化する」こと。もちろんそれは正しいのですが、実はもう一つ、見落とされがちな重大なリスクがあります。

それが「ユーザー名(ログインID)の漏えい」です。

WordPressの標準仕様には、外部から特定のURLにアクセスするだけで、管理者のユーザー名が取得できてしまう「抜け穴」が存在します。

ハッカーが不正ログインを狙うとき、最初にやることは「ユーザー名を特定すること」です。ユーザー名さえ分かれば、あとはパスワードを総当たりで試すだけ——つまり、ユーザー名を隠すことは、不正アクセス対策の最初の防衛ラインと言っても過言ではありません。

本記事では、ユーザー名漏えいの2つの主な経路と、SiteGuard WP Pluginを使った具体的な対策方法を、初心者の方にもわかりやすく解説します。


1. ユーザー名が漏えいする2つの抜け穴

抜け穴① 投稿者アーカイブへのリダイレクト(?author=1

WordPressには「投稿者アーカイブ」というページが標準で存在します。これは「この著者が書いた記事一覧」を表示するページですが、問題はその表示形式にあります。

以下のURLをブラウザで入力してみてください(example.comはご自身のドメインに置き換えてください)。

https://example.com/?author=1

対策がされていないWordPressサイトの場合、自動的にURLが切り替わり、ユーザー名を含むURLに変わります。

https://example.com/author/【あなたのユーザー名】/

数字の部分(?author=1)を変えることで、複数ユーザーのIDを順番に取得することも可能です。これをセキュリティ用語では「ユーザー列挙(User Enumeration)」と呼びます。


抜け穴② REST APIによるユーザー情報の取得(wp-json

WordPress 4.7以降、標準で有効になっている「REST API」にも同様のリスクがあります。

以下のURLにアクセスするだけで、認証なしでサイトのユーザー情報が取得できてしまいます。

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

または、以下のパラメータ形式のURLでも同様の情報が取得できます

https://example.com/?rest_route=/wp/v2/users

このURLにアクセスすると、ユーザーID・ユーザー名・表示名などの情報がJSON形式(テキスト)で画面に表示されてしまいます。

セキュリティ研究者の検証では、このエンドポイントを悪用することで、管理者アカウントのユーザー名が1リクエストで取得され、そのままブルートフォース攻撃(パスワード総当たり)の標的にされるケースが確認されています。

⚠️ 補足:WordPress本体の更新でこのエンドポイントへの対策は少しずつ改善されていますが、「設計上、認証なしでもアクセス可能な仕様」であることは変わっていません。プラグインや設定による追加の対策が引き続き有効です。

2. なぜユーザー名が漏えいすると危険なの?

「ユーザー名がバレても、パスワードが分からなければ大丈夫では?」と思うかもしれません。

しかし、ハッカーの攻撃は「ユーザー名 + パスワード総当たり」の2段階で行われることが多く、ユーザー名を知ることで攻撃の難易度が大幅に下がります。

  • ユーザー名が不明な場合:「ユーザー名」と「パスワード」の両方を試行し続ける必要がある
  • ユーザー名が判明している場合:「パスワード」だけを試行すればよい → 攻撃が格段に効率化される

さらに、パスワードの試行には前述のXMLRPCのsystem.multicallが悪用されることがあり、短時間で大量のパスワードが試される恐れもあります。


3. SiteGuard WP Pluginを使った対策手順

「SiteGuard WP Plugin」は国内で広く使われているセキュリティプラグインで、上記2つの抜け穴を比較的簡単にふさぐことができます。

対策1:?author=1 を防ぐ(ユーザー名漏えい防御)

  1. WordPress管理画面の左メニューから [SiteGuard][ユーザー名漏えい防御] をクリック
  2. 機能を [ON] に切り替える
  3. [変更を保存] をクリック

これで?author=1でアクセスされても、ユーザー名を含むURLへリダイレクトされなくなります。


対策2:wp-json(REST API)の抜け穴を防ぐ

  1. 管理画面から [SiteGuard][REST API](または [ユーザー名漏えい防御] 内のREST API設定)をクリック
  2. 「REST APIの無効化」を [有効] にする
  3. [変更を保存] をクリック

この設定のポイントは、通常URL形式(/wp-json/...)だけでなく、パラメータURL形式(?rest_route=...)のアクセスもまとめてブロックしてくれる点です。2つの抜け穴を同時にふさげるのが大きなメリットです。

設定後、対象のURLにアクセスすると、認証なしのアクセスに対してエラーが返されるようになります。


4. 設定後の動作確認(必ず行ってください)

REST APIを無効化すると、一部のプラグインの動作に影響が出ることがあります。設定後は必ず以下の項目を確認してください。

✅ 確認リスト

① お問い合わせフォームのテスト送信 Contact Form 7やMW WP Formなどのフォームプラグインから、テスト送信を実行してください。

  • メールが正常に届けばOK
  • エラーが出る場合 → SiteGuardの「除外プラグイン」設定で、該当プラグインにチェックを入れて保存

② 記事の保存テスト ブロックエディタ(Gutenberg)で記事を新規作成し、下書き保存・公開が問題なくできるか確認します。 (ログイン中の管理者操作であれば、通常は問題ないケースが多いです)

③ UpdraftPlusのGoogle Drive連携設定(初回・再認証時のみ) REST APIが無効化されていると、Google認証後にWordPressサイトへ戻る際にエラーが起きることがあります。

  • 初期設定・再認証時は、一時的にREST APIの無効化を解除する
  • または、SiteGuardの「除外プラグイン」でUpdraftPlusを許可しておく

5. プラグインを使わずにコードで対応したい場合

「他のREST API機能は生かしたまま、ユーザー情報だけを非公開にしたい」という場合は、テーマのfunctions.phpに以下のコードを追加する方法もあります。

php

add_filter( 'rest_endpoints', function( $endpoints ) {
    if ( ! is_user_logged_in() ) {
        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;
});

このコードは「ログインしていないユーザー(未認証アクセス)に対してのみ、ユーザー一覧のエンドポイントを非公開にする」という設定です。管理者など認証済みのユーザーは引き続きREST APIを使えます

⚠️ 注意: functions.phpを編集する際は、必ず事前にバックアップを取ってから行ってください。コードに誤りがあるとサイトが表示されなくなることがあります。

まとめ:ユーザー名を隠すことが不正アクセス対策の第一歩

今回紹介した2つの対策をまとめます。

抜け穴原因SiteGuardでの対策
?author=1投稿者アーカイブへのリダイレクト「ユーザー名漏えい防御」をON
wp-json/wp/v2/usersREST APIによるユーザー情報取得「REST API無効化」を有効

どちらも設定自体は数分で完了します。設定後は必ず動作確認を行い、問題があればSiteGuardの「除外プラグイン」設定で個別に対応しましょう。

パスワードの強化と合わせて、ユーザー名の非公開化もセットで取り組むことで、不正アクセスのリスクを大きく下げることができます。ぜひ今日中に設定してみてください!