【WordPress】投稿者アーカイブからユーザー名を守る3つの方法
WordPress は人気の CMS ですが、初期状態のセキュリティはそこまで強固ではありません。
標準の WordPress はログイン画面やユーザー名(ログインID)が簡単に見つかってしまうので、ユーザーは各自対策をしてセキュアな状態を保たなければいけません。
ユーザー名が表示される箇所はいくつかあるのですが、今回の記事ではそれらを隠す方法を紹介します。
ユーザー名が表示されるのは以下の3箇所です。
- 投稿者アーカイブへのリダイレクト
- WP REST API のユーザー一覧
- 標準サイトマップの
wp-sitemap.xml
に含まれる投稿者アーカイブ
これから紹介する対策方法はfunctions.php
に記述するため、サイトが真っ白になるリスクがあります。functions.php
の更新はすべて自己責任でお願いします。
投稿者アーカイブへのリダイレクトで表示されるユーザー名を隠す
WordPress には投稿者アーカイブと呼ばれる、ある投稿者の記事一覧ページがあるのですが、アーカイブ URL のスラッグにユーザー名が使われています。
example.com/author/admin_user/
このように。
投稿者アーカイブを使っていないつもりでも、WordPress のリダイレクト機能を悪用されてユーザー名が判明してしまう場合があります。
URL に「?author=1」などと指定し、もしユーザーID が 1 の admin_user というユーザー名がいたら、上記の URL にリダイレクトされます。
投稿者アーカイブであるauthor.php
が存在しなくても、このリダイレクトによって 404 になるにもかかわらずユーザー名が第三者に表示されてしまうのです。
example.com/?author=1
↓ 404 でもリダイレクトされる
example.com/author/admin_user/
対策方法は投稿者アーカイブを使っているかどうかで方法が変わります。
投稿者アーカイブを使っている場合は 「Edit Author Slug」 プラグインで対策する
投稿者アーカイブを使っているとアーカイブ自体を無効化することができないので、投稿者アーカイブのパーマリンクを変更できるプラグインを使います。
Edit Author Slug は投稿者アーカイブのパーマリンクを編集できるプラグインです。
このプラグインを使って投稿者アーカイブのスラッグをユーザーID に変更すれば、投稿者アーカイブからユーザー名を守ることが出来ます。
投稿者アーカイブを使っていなければリダイレクトを無効化する
投稿者アーカイブを使っていないテーマであれば、投稿者アーカイブへのリダイレクトは必要ないので無効化しても問題はありません。functions.php
に以下を記述し、author というパラメータを使えないようにします。
//?author=X を無効化
function disable_author_archive_query() {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) && !preg_match('/post_author=/i', $_SERVER['QUERY_STRING']) ){
wp_redirect( home_url() );
exit;
}
}
add_action('init', 'disable_author_archive_query');
このコードは Google で検索するとたくさんヒットするものなのですが、少し改良してあります。
もとは「パラメータに author=X が含まれていた場合」だったのですが、WordPress の管理画面で一括編集するときに暴発してしまうので、
「パラメータに author=X が含まれている、かつ post_author が含まれていない場合」に変更してあります。
WP REST API で表示されるユーザー名を隠す
example.com/wp-json/wp/v2/users
example.com/?rest_route=/wp/v2/users
2つ目は WP REST API の対策についてです。
上記のURL を見ると、REST API を経由してユーザー名一覧が JSON 形式で表示されています。
以下がユーザー名の JSON です。
REST API を使っていなければ REST API 自体を無効化したいところですが、最新版の WordPress ではシステム自体が REST API に依存しているため非推奨のようです。
ユーザー名一覧のエンドポイントを無効化するには、以下をfunctions.php
に記述します。
//WP REST API の不要なエンドポイントを削除する
add_filter('rest_endpoints', function ($endpoints) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
if ( isset( $endpoints['/wp/v2/users/(?P[\d]+)'] ) ) {
unset( $endpoints['/wp/v2/users/(?P[\d]+)'] );
}
return $endpoints;
});
この記述を追加することで、ユーザー一覧を取得しようとすると 404 が表示されるようになり、ユーザー名を守ることができます。
標準サイトマップの wp-sitemap.xml に表示されるユーザー名を隠す
3つ目はサイトマップに表示されるユーザー名を隠す方法についてです。
以前書いた記事でも紹介したのですが、WordPress 5.5 から標準機能としてサイトマップが追加されました。
この標準サイトマップには投稿者アーカイブが含まれています。
example.com/wp-sitemap-users-1.xml
この URL により投稿者アーカイブを含むサイトマップが表示されます。
サイトマップは以下のように表示されます。
対策方法はサイトマップの投稿者アーカイブを個別に無効化するか、サイトマップ全体を無効化することです。
//wp-sitemap.xml 投稿者アーカイブを無効化
function sitemap_hide_user($provider, $name) {
if ('users' === $name) {
return false;
}
return $provider;
}
add_filter('wp_sitemaps_add_provider', 'sitemap_hide_user', 10, 2);
もしくは
//wp-sitemap.xml を無効化
add_filter( 'wp_sitemaps_enabled', '__return_false' );
まとめ
少し前なら投稿者アーカイブへのリダイレクト対策だけで済んでいたのですが、WordPress のバージョンアップによって別の角度からユーザー名が出てしまうことがあります。
WordPress の機能追加があったらユーザー名が漏れてないかチェックしたほうがいいですね。