WordPressには、投稿者ごとの記事一覧を表示する投稿者アーカイブ(/author/ユーザー名/)があります。1人運営のブログでは不要なうえ、URLにログイン名が露出するため、セキュリティ上無効にしたいことがあります。この記事では、アーカイブの無効化に加えて、本命である「ユーザー名の列挙」対策まで解説します。
本当に防ぎたいのは「ユーザー名の列挙」
アーカイブページを消すだけでは不十分です。攻撃者は
アーカイブページを消すだけでは不十分です。攻撃者は
?author=1・?author=2… と連番でアクセスし、WordPressが /author/ログイン名/ へリダイレクトする挙動を利用してログイン名を割り出します(ユーザー列挙)。この ?author=N を止めることが対策の中心です。この記事でわかること
- 投稿者アーカイブを404にする(
is_author()) ?author=Nの列挙を止める(本命)- 404にするか・リダイレクトするかの違い
- REST APIなど他の漏洩経路への対処
方法1:functions.phpで404にする+列挙をブロックする(推奨)
子テーマの functions.php に次のコードを追加します。前半で投稿者アーカイブを404にし、後半で?author=N の列挙リクエストをリダイレクト前に止めます。この2つをセットにするのがポイントです。
functions.php:アーカイブ404+?author=N列挙ブロック
// (1) 投稿者アーカイブページを404にする
add_action('template_redirect', function () {
if (is_author()) {
global $wp_query;
$wp_query->set_404();
status_header(404);
nocache_headers();
}
});
// (2) ?author=N の列挙を、リダイレクトでログイン名が漏れる前に止める
add_action('init', function () {
if (!is_admin() && isset($_GET['author'])) {
wp_safe_redirect(home_url('/'), 301);
exit;
}
});
なぜ init 段階で止めるのか
?author=1 は、WordPressが /author/ログイン名/ へリダイレクトする時点でログイン名が漏れます。そのリダイレクトより前の init で処理すれば、名前を出さずにトップへ戻せます。アーカイブ側(template_redirect)と列挙側(init)の両方を塞ぐのが確実です。404にする?リダイレクトする?の違い
「アクセスされたときにどう返すか」で2つの考え方があります。目的に合わせて選びます。
| 返し方 | 挙動 | 向いている場面 |
|---|---|---|
404(set_404()) |
「ページは存在しない」と返す | そのページを完全に無くしたい・検索にも出したくない |
| 301リダイレクト | トップページ等へ転送する | 訪問者を別ページへ誘導したい |
アーカイブページ自体は404で消し、列挙用の ?author=N はリダイレクトで名前を隠す、という上記の組み合わせが実用的です。noindexにしてインデックスだけ防ぐ方法もあります(後述のFAQ)。
方法2:セキュリティプラグインを使う
コードを書きたくない場合は、SiteGuard WP Plugin・Wordfence・iThemes(Solid)Security などのセキュリティプラグインに「ユーザー名(作者)ページの無効化」「ユーザー列挙の防止」オプションがあります。設定を有効にするだけで、?author=N の列挙まで含めて対策できるものが多いです。
方法3:.htaccess(Apache)で制限する
Apacheサーバーなら .htaccess でも対処できます。クエリ文字列の ?author= もあわせてブロックするのがポイントです(URL部分だけを弾くと ?author=N をすり抜けます)。
.htaccess:/author/ と ?author= を制限
RewriteEngine On
RewriteBase /
# ?author=数字 の列挙をブロック
RewriteCond %{QUERY_STRING} (^|&)author=\d+ [NC]
RewriteRule .* / [L,R=301]
# /author/ へのアクセスをブロック
RewriteRule ^author/ / [L,R=301]
WordPress管理ブロックの外に書く
WordPressは
WordPressは
.htaccess の # BEGIN WordPress 〜 # END WordPress の部分を自動で書き換えるため、そこに書くと消えることがあります。カスタムのルールはそのブロックの外(上か下)に書いてください。Nginxの場合は .htaccess は使えないため、サーバー設定(location ブロック)で対応します。編集前に必ずバックアップを取りましょう。投稿者名は他の経路からも漏れる
アーカイブ対策だけでは片手落ち
ログイン名・投稿者名は次からも露出します。目的がユーザー名の秘匿ならまとめて対処してください。
①REST API:
②XMLサイトマップ:
③表示名の使い回し:公開名をログイン名と同じにしない → ログインIDと表示名の違い・変更方法
④RSSフィードの投稿者名 → RSSフィードの投稿者名を非表示にする方法
ログイン名・投稿者名は次からも露出します。目的がユーザー名の秘匿ならまとめて対処してください。
①REST API:
/wp-json/wp/v2/users で投稿者一覧が取得できる場合がある②XMLサイトマップ:
wp-sitemap.xml の投稿者一覧 → wp-sitemap.xmlから投稿者を削除する方法③表示名の使い回し:公開名をログイン名と同じにしない → ログインIDと表示名の違い・変更方法
④RSSフィードの投稿者名 → RSSフィードの投稿者名を非表示にする方法
よくある質問(FAQ)
Qアーカイブを消したのに ?author=1 でログイン名が分かってしまいます。
Aアーカイブページの404だけでは
?author=N のリダイレクトによる列挙を防げません。方法1の後半のように init で $_GET['author'] を検知してリダイレクト前に処理するか、.htaccess でクエリ文字列ごとブロックしてください。Q無効化ではなく検索に出さない(noindex)だけにしたい。
A
is_author() のときに <meta name="robots" content="noindex"> を出力します。add_action('wp_head', function () { if (is_author()) { echo '<meta name="robots" content="noindex,follow">'; } });。Yoast SEOなら「検索での見え方 → 作成者アーカイブ」でnoindexに設定できます。QURLに出る投稿者スラッグ(ユーザー名)を変えたい。
AURLのスラッグは
user_nicename で決まり、初期値はログイン名と同じです。これを別の値に変えると露出を減らせます(管理画面からは直接変更できずDB操作が必要)。あわせて公開される表示名もログイン名と別にしておきましょう(表示名の変更方法)。まとめ
- アーカイブ無効化:
is_author()でset_404()(存在しないと返す) - 本命の列挙対策:
initで?author=Nをリダイレクト前に止める - 404かリダイレクトか:ページを消すなら404、誘導するなら301と使い分け
- 他経路も塞ぐ:REST API・サイトマップ・表示名・RSSをまとめて対処
「アーカイブを消す」だけで満足せず、?author=N の列挙と他の漏洩経路までセットで対策するのが、本当の意味でのユーザー名保護です。
