WordPressでユーザー名を特定されないようにする方法
WordPressでユーザーを追加する際には、ユーザー名と一緒にユーザーIDの番号が連番で振られますが、サイトのトップページのURLの最後に「/?author=1」のように番号をつけてアクセスすると、対象のユーザー情報(アーカイブページ)が表示されます。
そのアーカイブページのURLの末尾には「/?author/username」のようにユーザー名が付いており、少しWordPressの仕様を知っている方であれば、簡単にauthor情報でユーザー名を特定することができます。
パスワードほど重要ではありませんが、ログインに必要な情報の1つであるユーザー名が簡単にわかってしまうのは、セキュリティ上よくありません。
ユーザー名がわかれば残りのパスワードを、総当たり攻撃[ブルートフォースアタック](パスワードの考えられるすべての組み合わせを試す方法)で突破されログインされる可能性もあります。
ここでは、WordPressでユーザー名を簡単に特定できてしまう仕様の対処方法についてご紹介します。
WordPressのテーマファイルのfunctions.phpで対処していきます。
functions.phpで対処
まずは作業前に、これから編集するfunctions.phpのバックアップをとっておきましょう。
(記述ミスでサイトが壊れる恐れがあるため)
対処方法としては、「/?author=n」にアクセスした時に、別ページにリダイレクトするようにします。
アクセス時のリダイレクト処理
アクションフックを使って、リダイレクトさせる処理をfunctions.phpに記述していきます。
独自の関数を作成します。関数名はわかりやすい名前にしてもらえばOKです。
サンプルでは「invalid_author_archive_query」としています。
以下、サンプルコードになります。
function invalid_author_archive_query() {
if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING']) ){
wp_safe_redirect( home_url() );
exit;
}
}
add_action('init', 'invalid_author_archive_query');
PHPスクリプトのpreg_match関数を使って、第1引数の0個以上の数字の検索パターンと、第2引数の「$_SERVER[‘QUERY_STRING’]」で取得したクエリ文字(ユーザーIDの数字)が一致した時を条件に、WordPressのwp_safe_redirect関数でリダイレクトさせるといった処理になります。サンプルではhome_url関数でサイトのトップページにリダイレクトさせています。
スクリプトの最後はexitで処理を終了させます。(wp_safe_redirect関数は自動的にexitしないので)
404ページにリダイレクトさせる場合は、wp_safe_redirect関数の引数を「home_url(‘/404.php’)」といった感じでリダイレクト先を指定します。
リダイレクトさせる関数ができましたら、add_action関数で処理を実行します。
第1引数のフックされるアクション名は、WordPressの読み込みが終わってから1番最初に読み込むアクションとして「init」とします。
そして第2引数に、フックする関数として「invalid_author_archive_query」を指定します。
REST APIの機能による情報漏れ
WordPress4.7以降に標準搭載となったREST APIの機能により、サイトのトップページのURLの最後に「/wp-json/wp/v2/users」を追加してアクセスすると、APIが取得したデータとしてユーザー名を含む様々な情報が表示されてしまいます。
この問題も一緒に対応しておいた方がいいでしょう。
以下のコードをfunctions.phpに追加することで、ユーザー名などの重要な情報を表示させないようにできます。
function my_filter_rest_endpoints( $endpoints ) {
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;
}
add_filter( 'rest_endpoints', 'my_filter_rest_endpoints', 10, 1 );
unset関数を使って、指定した変数の割り当てを解除(削除)するといった処理になります。
余談
あまりないとは思いますが、簡単なユーザー名(自分の名前)などにしていても特定される可能性はあります。
もし別の理由でユーザー名が漏れたとしても、残りのパスワードで総当たり攻撃を受けないよう、念のためログイン画面にアクセス制限をかけておくといいでしょう。
また、REST APIの情報の処理を調整しますと、投稿画面にて投稿者の項目が表示されなくなります。
複数人で運営するメディアで、投稿者を変更する必要があるような運用をする場合は、REST APIの機能による情報漏れを防ぐ方法をとるのは難しくなりますので、REST APIの情報の処理をせず、ログイン画面のアクセス制限は必ず必要となります。
htaccessとhtpasswdの2つのファイルで、ログインページにBasic認証を設定してアクセスを制限できます。
htaccessファイルにて「wp-login.php」のファイルに対して、Basic認証をドキュメントルートに置いてあるhtpasswdファイルの場所を指定して設定します。
.htaccess
<Files wp-login.php>
AuthName "Input ID & Password"
AuthType Basic
AuthUserFile /home/〇〇〇〇/〇〇〇〇〇〇〇〇/public_html/.htpasswd
Require valid-user
</Files>
htpasswdの作成方法を含め、詳しくは以下の記事でご紹介しています。
WordPressのユーザー名は重要な情報になりますので、なるべく第三者に特定されないようにしておきましょう。