WordPress のユーザー名漏えい(ユーザー列挙)を防ぐには?
執筆:Eureka Studio · 更新日
要点
WordPress は 4 つの公開された場所でユーザー名を見せています。REST エンドポイント /wp-json/wp/v2/users、?author=1 のリダイレクト、投稿者アーカイブの URL、そしてコアのユーザーサイトマップです。これらを隠すには、ログアウト中の訪問者には REST の一覧をブロックし、?author= スキャンを止め、ユーザーサイトマップを削除し、ログインエラーのメッセージを共通にします。プラグインなら 4 つすべてに対応できます。対処後は、それぞれをテストしてください。
手順
1手順 1
WordPress が今何を見せているか確認する
ログアウトした状態で yoursite.com/wp-json/wp/v2/users にアクセスします。デフォルトのインストールでは JSON の一覧が返され、slug 欄に各投稿者のログイン名が入っています。
2手順 2
投稿者スキャンを試す
次に yoursite.com/?author=1 にアクセスします。WordPress は /author/your-username/ へリダイレクトし、アドレスバーに名前が表示されます。ボットは 1、2、3 と番号を増やして、すべてのユーザーを集めます。
3手順 3
4 か所を塞ぐ
「Hushfort → 攻撃面の強化」を開いてオンにします。「REST ユーザー一覧」、「投稿者スキャン」(「?author=1 スキャンをブロック」)、「サイトマップの投稿者一覧」、「oEmbed の投稿者情報」をオンのままにして保存します。
4手順 4
プライベートウィンドウでもう一度テストする
ログアウトした状態で同じリクエストを繰り返します。ユーザー一覧は 404 とともに「rest_no_route」を返すようになり、?author=1 もユーザー名へリダイレクトしなくなります。
なぜ重要なのか
ログインするために、攻撃者に必要なものは 2 つ。ユーザー名とパスワードです。WordPress は初期状態のままだと、その前半を差し出してしまいます。これはバグではなく、それぞれの場所には理由があります (アプリ向けのフィード、わかりやすい投稿者 URL、検索エンジン)。しかしそれらが組み合わさると、どんなボットでも数秒でサイトのログイン名をすべて一覧にできてしまいます。
ユーザー名を隠しても、弱いパスワードが安全になるわけではありません。隠すことで、パズルの簡単なほうの半分がなくなり、推測のたびに名前とパスワードの両方を当てなければならなくなります。ログイン制限や二要素認証と組み合わせれば、推測は「時間がかかる」から「見込みがない」に変わります。
WordPress がユーザー名を公開している 4 か所:
- REST API —
/wp-json/wp/v2/usersが投稿者をスラッグ付きで一覧表示します。スラッグは通常、ログイン名と同じです。 - 投稿者スキャン —
/?author=1が/author/login-name/へリダイレクトします。 - 投稿者アーカイブ — アーカイブの URL 自体に投稿者スラッグが含まれています。
- コアのサイトマップ —
/wp-sitemap-users-1.xmlが投稿者アーカイブの URL を一覧表示します。oEmbed の応答にも投稿者の情報が含まれることがあります。
よくある間違い
- 1 か所を直して終わりにする。 REST の一覧が開いたままなら、
?author=を塞いでもボットにとっては何も変わりません。4 か所すべてを確認してください。 - 表示名がログイン名と同じ。 すべての漏えいを塞いでも、テーマが「投稿者: admin」と表示すれば名前はわかってしまいます。「ユーザー → プロフィール」で別の表示名を設定してください。
- 本物の投稿者ページを壊してしまう。 書き手が複数いるブログでは、投稿者アーカイブは役に立ちます。アーカイブそのものではなく、番号スキャンをブロックしてください。
- 詳しすぎるログインエラー。 「ユーザー名 jane のパスワードが間違っています」というメッセージは、その名前が存在することを裏付けてしまいます。どちらの場合も同じメッセージを使いましょう。
プラグインを使わない方法
ほとんどは必須プラグイン (wp-content/mu-plugins/hide-users.php) で対応できます:
<?php
// 1. REST user list: logged-out visitors get nothing.
add_filter( 'rest_endpoints', function ( $endpoints ) {
if ( ! is_user_logged_in() ) {
unset( $endpoints['/wp/v2/users'], $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
return $endpoints;
} );
// 2. ?author=N scans: stop the redirect that reveals the name.
add_action( 'template_redirect', function () {
if ( isset( $_GET['author'] ) && ! is_admin() ) {
wp_safe_redirect( home_url( '/' ), 301 );
exit;
}
} );
// 3. Core sitemap: drop the users provider.
add_filter( 'wp_sitemaps_add_provider', function ( $provider, $name ) {
return 'users' === $name ? false : $provider;
}, 10, 2 );
// 4. Same message for wrong username and wrong password.
add_filter( 'login_errors', function () {
return 'The username or password is incorrect.';
} );
注意点: テーマやプラグインが REST ユーザー一覧を読み取ることがあるため、まずステージングサイトでテストしてください。これでアーカイブ URL の投稿者スラッグは変わりません。変えるには、各投稿者の nicename を変更するか、表示名用のプラグインを使います。また、サイトを移転したり作り直したりするときに、管理すべきファイルがひとつ増えることになります。
うまくいかないときは
- 連携サービスが投稿者一覧を取得できなくなった。 外部ツールの中には、ログインせずに
/wp/v2/usersを読み取るものがあります。アプリケーションパスワードを発行して認証させるか、一覧を再び許可してください。 - 投稿者ページが 404 になる。 投稿者アーカイブを完全に無効化する設定を選んでいます。番号スキャンだけをブロックする選択肢に切り替えてください。
- SEO プラグインがまだ投稿者を一覧表示している。 多くの SEO プラグインは独自の投稿者サイトマップを生成します。そのプラグインでも投稿者サイトマップをオフにしてください。
Hushfort なら
ユーザー名シールドは 無料の WordPress セキュリティプラグイン Hushfort Security に追加する有料アドオン Hushfort Pro の機能です。何がまだ漏れているかを示す攻撃面スキャンは、無料版プラグインに含まれます。
Hushfort の攻撃面の強化レイヤーに含まれる ユーザー名シールド は、4 か所すべてをひとつの画面で塞ぎます:
- ログインしていない訪問者に対して、REST の
/wp/v2/usersの一覧をブロックします。 /author/name/のアーカイブは残したまま、?author=Nスキャンをブロックします (お好みでアーカイブ自体を無効にすることもできます)。- コアのユーザーサイトマップと、oEmbed の応答に含まれる投稿者情報を削除します。
- ユーザー名が間違っている場合もパスワードが間違っている場合も、ログインエラーのメッセージを同じにします。
その後、攻撃面スキャン が実際のリクエストで各箇所をテストし、まだ漏れているユーザー名があれば名指しで示します。
よくある質問
WordPress のユーザー名の列挙とは何ですか?
ユーザー名が見えているとセキュリティ上のリスクになりますか?
REST ユーザー一覧をブロックするとエディターが壊れますか?
投稿者アーカイブページは残せますか?
ログインエラーのメッセージはなぜ重要なのですか?
関連するハウツー
WordPress サイトが外部に何を公開しているか、セキュリティチェックするには?
ボットと同じ 5 つのリクエストで WordPress をセキュリティチェック。ログイン画面、XML-RPC、ユーザー名の公開状況と塞ぎ方を解説します。
手順を読むxmlrpc.php とは何ですか? WordPress で無効化するには?
xmlrpc.php とは何か、WordPress で安全に無効化する方法を解説。ログインを隠しても残る入口を閉じ、ピンバックを残す方法も紹介します。
手順を読むWordPress でログイン試行回数を制限するにはどうすればいいですか?
WordPress でログイン試行回数を制限し、総当たり攻撃を止める方法。効果的な設定値、プラグインなしのコード、見落としがちな抜け道を解説します。
手順を読む



