【WordPress】投稿者名(author/ログインアカウント)の情報を読み取られないように(非表示)するカスタマイズ

WordPress

CSSで非表示にしただけでは無意味ですよ

ということで、WordPressで徹底的に投稿者名(ログインアカウント)を秘匿するカスタマイズについてまとめました。

WordPressのデフォルト設定ではログインユーザー名が丸見え

WordPressではデフォルトで投稿者名(=author、作成者、ユーザー名、ログインアカウント)が複数の方法で読み取り可能な状態(ほぼ丸見え)になっています。

これはWordPressのポリシーらしいのですが、やっぱりちょっと気になるので非表示にしたいと思います。

WordPress投稿者名が丸見えの仕様は知らない方も多いようで、よくわからないIDが知られてしまう分にはまあ良いのですが、ユーザー名(ログインID)をメールアドレスで登録していて丸見えのまま運用してたり。(私です。)

すでに情報提供されている方が多くいらっしゃるのですが、不十分なものも多くいくつかの対策方法を組み合わせて行う必要があったため、私が行ったひととおりの方法を記録のためにまとめておきます。

WordPressでCocoonテーマを適用している環境を例としていますが、WordPress全般の設定がメインなので、他のWordPressテーマでも有効な説明も行っていますので参考になれば幸いです。

WordPressの構造自体が投稿者名を隠す作りになっていない

冒頭でも少し触れましたが、そもそもの前提として、WordPressの構造自体が投稿者名やアカウント名を秘匿する構造になっていないことを知っておいたほうが良いと思います。

WordPressはコンテンツ管理システムとして、ユーザーが記事ページの制作を行うことに連携して、カテゴリページやタグページ、検索機能やプラグインが提供する各種拡張機能などを提供し、サイトの運営をより簡単かつ効率的に行うことができるシステムです。

そして、WordPressはユーザーが簡単に管理できる一方で、裏ではいろいろな処理が自動化されているとともにプログラム同士の連携や効果的なサイト運営のためにいろいろな情報が外部に公開されたり連携されていたりします

これは本来WordPressの設計思想として、仮に読み取られてもセキュリティ面では大きなリスクにならないことや、WordPressのサイト運営者同士のコミュニケーションのひとつの手段として意図的に機能として提供されているとされているものなので、これらの機能は有効にサイト運営に活用するのが本来の考え方となります。

しかしながら、それらの情報の中にはWordPressのサイト管理者のアカウント情報に該当するものや場合によっては個人情報を読み取られてしまうようなものもあります。私のように誤って非公開のメールアドレスをそのままログインアカウントにしていたような場合、知らないうちに見せたくない情報を表に出してしまうこともありえるため、WordPressがどのような形で情報を見られるようにしているのかを把握し、必要な対応を行っておくことが重要です。

WordPressで投稿者名(ログインアカウント)を読み取る方法

まずは対策の対象となる部分の把握のため、そもそもWordPressのどこを見ると投稿者名やログインアカウントをどういう方法(手口)で読み取ることができるのかを確認しておきましょう。

ここではWordPress+Cocoonテーマで作成されたブログサイトを例にして紹介しています。

まず、WordPressで構築されたサイトでログインアカウントを読み取れる場所は大きく4か所あります。

  • WordPressの投稿者、author、作成者、ユーザー名のアーカイブページ
  • Cocoonテーマの投稿者名(のソースコード)
  • コメントリストのソースコード
  • WordPress REST API

それぞれについて下記で説明していきます。

1. WordPressの投稿者、author、作成者、ユーザー名のアーカイブページ

WordPressのデフォルトの設定では、投稿者ごとのアーカイブページが自動的に作成され、これはユーザー名を把握していなくても決まったURLの書式でアクセスすることができます。

しかも、アクセスするとユーザー名がわかるようなURLにリダイレクトする、というおまけ付きです。

例えば、未対策のWordPressのサイトで、「https://サイトのURL/?author=1(例:https://cravelweb.com/?author=1)」にアクセスします。

そうすると「https://サイトのURL/author/投稿者名(例:https://cravelweb.com/author/cravel)」のようなページにリダイレクトされ、投稿者が投稿した記事の一覧が表示されます。

この「投稿者名」がユーザ名そのままなので、WordPressのログインIDがわかってしまうほか、ユーザー名をメールアドレスなどで登録していると、そのまま投稿者のメールアドレスを読み取ることができてしまいます。

そもそもメールアドレスでユーザー登録することが問題なのかもしれませんが、意外にやりがちで気づかないままになってたりするんですよね。

2. 投稿の最後などに表示される投稿者名(と、そのソースコード)

WordPressのテーマの多くでは、投稿の公開ユーザーがその記事の執筆者名として表示されます。Cocoonテーマの例では投稿の下部に投稿者名が表示されます。

ここで表示されるのはWordPressのユーザープロフィールで設定した「ブログ上の表示名」の情報が表示されるようになっているのですが、同時にテキスト上にリンクが設定されていて、そのリンク先が前述の「https://サイトのURL/author/投稿者名になっています。

そのため、こちらからも同様にWordPressのユーザー名を読み取ることができます。

Coconテーマの例では、「Cocoon設定」→「本文」→「投稿情報表示設定」→「投稿関連情報」→「投稿者名の表示」のチェックボックスからこちらの表示を「非表示」にすることができるのですが、これはデータ上削除されているわけではありません。

スタイルシートを使って実際は見えないような「非表示にする」処理が施されるのみで、ソースコードには前述の内容がそのまま残されているため、容易にWordPressのユーザー名を読み取ることができてしまいます。

この非表示の処理については、ページの構造化データのエラー回避のためとされていますが、できれば「非表示」ではなく、情報自体を「非出力」にするようなカスタマイズが望ましいです。

3. コメントリストのソースコード

WordPress投稿のコメント欄にはユーザー名やコメントの内容が表示されますが、こちらのコメントのソースコードを見ると、スタールシートのクラス名にWordPressのユーザー名が使用されています。

こちらもページ上では非表示ですが、ソースコードから読み取れてしまう内容のため非出力にしたい箇所になります。

4. WordPress REST API

WordPressのバージョン4.4以降、REST APIが導入され、こちらの内容からもユーザー名を読み取ることができるようになっています。

以下のURLでアクセスしてみると、内容にユーザー名が含まれたデータ(json)が表示されます。

「https://サイトのURL/wp-json/wp/v2/users (例:https://cravelweb.com/wp-json/wp/v2/users)」

こちらは意図してアクセスすることは少ないデータだとは思いますが、簡単にユーザー名を読み取ることができてしまうため、出力自体を無効にしたい箇所となります。

WordPressで投稿者名(=ログインアカウント)の情報を読み取られないようにするカスタマイズ手順

前述の4か所に対する対策ですが、大きく2つの対応について紹介します。

ひとつは、phpのソースコードなどを書き換える方法。もう一つはWordPressのプラグイン「XO Security」を使用する方法です。

結論から言うと、「Cocoonの投稿者名」の変更以外の3つについてはすべて「XO Security」が提供する機能で問題なく対策できます。素晴らしいプラグインです。ありがとうございます。

ですので、手軽な対応としてはXO Securityをインストールし、必要な設定を行った後「Cocoonの投稿者名」の表示カスタマイズを行ってください。

下記ではXO Securityを使用しないphpの追記の方法も加えて解説しています。

WordPressの投稿者、author、作成者、ユーザー名のアーカイブページを非表示にする

XO Securityで設定する場合

「設定」→「XO Security」→「秘匿」→「作成者アーカイブの無効化」チェックボックスをオンにして「変更を保存」をクリックします。

functions.phpで設定する場合

2つの処理をfunctions.phpに加えます。

アーカイブページを無効にする。

add_filter( 'author_rewrite_rules', '__return_empty_array' );

functions.phpファイル更新後、「設定」→「パーマリンク」の「変更を保存」をクリックし、一度設定を保存すると反映されます。(パーマリンクの設定内容自体を変更する必要はありません)

author=1などからのアクセスを404ページにリダイレクトさせる。

add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
	if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
		wp_redirect( home_url( '/404.php' ) );
		exit;
	}
}
add_action('init', 'disable_author_archive');

以上で、投稿者のアーカイブページが無効化され、URLに直接アクセスした場合は404ページが表示されるようになります。

Cocoonテーマの投稿者名を非表示にして、構造化データを修正する

この項目に関してはXO Securityなどでは対応できないため、以下の手順を実施します。

Cocoonテーマの /tmp/content.php にある、投稿者表示用のテンプレート部分をコメントアウトして出力されないようにします。以下の個所を更新します。(185行目付近)

        <?php //投稿者等表示用のテンプレート
        //get_template_part('tmp/footer-meta');
        ?>

/tmp/content.phpは子テーマに含まれていないため、まずは親テーマからファイルをコピーし、親テーマと同じディレクトリ構造(/tmp/配下)に該当ファイルを配置してください。

この変更を加えることで、投稿ページ上の投稿者名の表示が出力されないようになりますが、構造化データに必要なauthorのデータ自体がページ内に出力されなくなってしまうため構造化データのエラーとなります。

構造化データのエラーについてはユーザーの閲覧上大きな問題は発生しませんが、SEOなどに影響するためサイト運営側にとってはできるだけ回避したいものかと思います。

そのため、ソースコードの他の部分をauthorデータとして指定し、このエラーを回避します。

/tmp/content.php の10行目にある内容を以下のように変更します。

<article id="post-<?php the_ID(); ?>" <?php post_class('article') ?> itemscope="itemscope" itemprop="blogPost" itemref="copyright" itemtype="http://schema.org/BlogPosting">

追記されたのは「itemref=”copyright”」の部分です。こちらで構造化データの参照先にページフッターのcopyrightを追加しています。

/tmp/content.php の更新が完了したら、「Cocoon設定」→「フッター」を開き、「クレジット表記」を「独自表記」に変更します。

「上記設定で「独自表記」と入力した場合」のテキストボックスに、以下のような内容を入力します。

<p id="copyright">©2015-2019 <span itemprop="editor author creator copyrightHolder"
 itemscope itemtype="http://schema.org/Person"><span itemprop="name">クラベル</span>
</span> All Rights Reserved.</p>

解説年、著作権者表記はご自身のものに差し替えてください。

コメントリストからユーザー名が読み取れる部分を変更する

XO Securityで設定する場合

「設定」→「XO Security」→「秘匿」→「コメント著者名クラスの無効化」チェックボックスをオンにして「変更を保存」をクリックします。

functions.phpで設定する場合

以下をfunctions.phpに追記します。

add_filter( 'comment_class', function( $classes ) {
    foreach( $classes as $key => $value ) {
        if( stripos( $value, 'comment-author-' ) !== false ) {
            unset( $classes[$key] );
        }
    }
    return $classes;
});

以上で、CSSのクラス名が投稿者名以外の文字列に置き換えられます。

WordPress REST APIによるユーザー情報を隠す

XO Securityで設定する場合

「設定」→「XO Security」→「REST API」→「REST API の無効化」チェックボックスをオンにし、リスト内にある「/wp/v2/users」「/wp/v2/users/(?P<id>[\d]+)」の2つのチェックボックスをオンにしてから「変更を保存」をクリックします。

functions.phpで設定する場合

以下を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 );

WordPressプラグインの「XO Security」がとにかく素晴らしい

XO Securityは今回のデータ秘匿設定のほか、ログインログや試行回数制限、遅延設定など、ログイン画面に対する不正アクセスに対して強力な対策を施すことができ、非常に有効です。

これまで個別にWordPressのソースに改修を加えていたのですが、結局XO Securityプラグインにたどり着いてこれまでのほとんどの改修がこのXO Securityプラグインだけで賄えるようになりました。

多くのテーマは今回説明した方法で対策できると思いますのでfunctions.phpの修正やXO Securityプラグインと組み合わせて対策してみてください。

コメント

タイトルとURLをコピーしました