wordpressでユーザー名が見えないように隠す非表示の方法

wordpressはパーマリンク設定で「?p=123」という形式のURL以外を選んだ場合、ユーザー名が見えてしまいます。具体的には、wordpressのルートドメインに「?author=1」などのパラメータを付け加えると著者ページへリダイレクトされ、URLの一部にログインするためのユーザー名を含んだ状態で表示します。1はwordpressで記録されているユーザーのID番号です。変更していなければ管理者は大抵1になります。以下はcurlというwindowsのコマンドプロンプト上で動くソフトウェアを使って検証した結果です。

wordpressのユーザー名を隠したつもりでも見えてしまうコード

「functions.php」に記載

以下のコードをwordpressテーマの「functions.php」に張付けた場合。トップページにリダイレクトされますが、curlコマンドを使うとユーザー名が見えます。

add_action( 'template_redirect', function (){
if( is_author() ) {
wp_redirect( home_url());
exit;
}
});

こちらもwordpressの「functions.php」に張付けた場合です。このコードは作成者アーカイブを作らないようにするためのものです。「__return_empty_array'」で空の配列を返しています。URLの一部にユーザー名を含んだページに飛ばされます。

add_filter( 'author_rewrite_rules', '__return_empty_array' );

「author.php」をwordpressテーマ内にアップロード

「author.php」を作成してwordpressのテーマにアップロードしたケース。管理者以外のユーザーID番号は、ホームにリダイレクトされますが、curlコマンドでURLの一部にユーザーの名称が見えてます。また、管理者はホームではなく、ユーザーの名前を含む作成者アーカイブに飛ばされる模様。

<?php
wp_redirect(home_url());
exit();
?>

「.htaccess」に記載

「.htaccess」の先頭に記述した場合。ホームに飛ばされますが、curlコマンドでユーザーの名前が確認できます。先頭としているのは、wordpressの設定より後で読み込むと動作しない場合があるからです。

RewriteEngine On
RewriteRule ^\?author=(.*)? / [R=302,L]
RewriteRule ^author/(.*)? / [R=302,L]

こちらも「.htaccess」の先頭に記述したケース。リダイレクトされて410エラーを返しますが、URLの一部にユーザー名を含み、更にcurlコマンドでもユーザーの名前が晒されています。

RewriteEngine On
RewriteRule ^\?author=(.*)? - [G]
RewriteRule ^author/(.*)? - [G]

wordpressのユーザー名が見えないコード

以下は、wordpressの「functions.php」に張付けたケースです。条件分岐の「!current_user_can( 'administrator')」は、管理者でない場合の処理を行うためのものです。取り除いても問題ありません。「wp_redirect( home_url( '/404.php' ) );」はwordpressテーマの404ページに転送しています。この部分は「header(' ', true, 404);」に置き換えて強制的に404エラーを吐き出させることもできますが、ブラウザによっては若干表示が異なります。また、「 '/404.php' 」を取り除くととwordpressのトップページへ転送されます。

add_action('init', function (){
if(!current_user_can( 'administrator')){
if((isset($_GET['author']) && !empty($_GET['author'])) || preg_match('`/author/.+`', $_SERVER['REQUEST_URI'])){
wp_redirect(home_url( '/404.php' ));
exit;
}
}
});

こちらもwordpressの「functions.php」に追記したケースです。「!current_user_can( 'administrator')」は無くても構いません。flush_rules()はルールを追加する際に必要で、その下のbaseとstructureで指定しています。home_urlの引数を除去するとwordpressのホームへ転送されます。「header(' ', true, 404);」でもユーザーの名前が隠れますが、IEはこのコードとexitの間に記述した文章を表示しないようです。

add_action('init', function (){
if(!current_user_can( 'administrator')){
global $wp_rewrite;
$wp_rewrite->flush_rules();
$wp_rewrite->author_base = '';
$wp_rewrite->author_structure = '/';
if (isset($_GET['author']) && !empty($_GET['author'])) {
wp_redirect(home_url( '/404.php' ));
// header(' ', true, 404);
exit;
}
}
});

なぜwordpressからユーザーIDが漏れるとまずいのか?

IDが分かってしまうと、あらゆるパスワードをwordpressのログインページへ送り付ける総当たり攻撃(ブルートフォース)の対象になってしまうリスクがあるためです。ユーザーをたくさん抱えているwordpressの管理者だと、今度は複数のユーザーIDを見つけ出して、それに対して一つのパスワードを送り付けるパスワードスプレー攻撃が成立してしまうリスクもあります。もっとも、個人でwordpressを運用している場合は、パスワードスプレー攻撃に対してほとんど心配する必要はないと思います。ブルートフォースの逆バージョンであるリバースブルートフォースもほとんど心配ないでしょう。見つけにくいパスワードを対象に予想でユーザーIDを片っ端から送信するより、見つけやすいユーザーIDに対して片っ端からパスワードを送り付けたほうが効率が良いからです。

wordpressは利用者が多いため、攻撃の対象になりやすいのは事実です。しかし、最近のレンタルサーバはwordpressを利用する人が増えたためか、wordpressに対するセキュリティにはかなり力を入れているようです。そのため、wordpressを運用するために神経をすり減らす必要もないと思います。細かく指摘しだしたらキリがありませんし。自分にできるところから気軽に始めるのが良いかとおもいます。

まとめ

wordpressのユーザー名がURL内に漏れているかどうかを確認するにはサーバのログを見るのが確実です。これはアドレスにユーザーの名前が入るためです。ただ、面倒ですね。そこでwindows上でもcurlコマンドを使えるソフトウェアを使うと便利です。フォルダのアドレスバーに「cmd」と入力すればコマンドプロンプトが勝手に開きます。そこに「curl https://wordpressのルートディレクトリ/?author=1 -v」と入力してEnterを押下すれば、リダイレクト先情報も取得できます。