【WordPress5.5】XMLサイトマップからユーザー用のリンクを除外する

WordPress5.5 から、組み込みの XML サイトマップが採用されました。このサイトマップは投稿・タクソノミー・ユーザーの一覧ページリンクのサイトマップ動的生成され、XSLT スタイルシート付きで人間にも見やすいというイカしたやつです。しかし、ユーザーの一覧も出力されるので、勝手に出されると困る方もいるでしょう。

ユーザー用のリンクを除外するフィルター

5.5 の開発段階では、wp_sitemaps_register_providers フィルタにより投稿・タクソノミー・ユーザーのサイトマップをざっくりとON/OFFできたのですが、7/22 に、細かな条件で制御ができるようフックが変更されました

wp_sitemap_add_provider フィルターでユーザーのサイトマップを全て無効化

wp-includes/sitemaps/class-wp-sitemaps-registry.php にある add_provider メソッドは、WP_Sitemaps_Posts (posts), WP_Sitemaps_Taxonomies (taxonomies), WP_Sitemaps_Users (users) の3つのクラスをネタ元にサイトマップを準備します。ここで wp_sitemap_add_provider フィルターフックを使い、users だった時は無視するようにしてやると、そのサイトマップは生成されなくなります。

functions.php に書く例

function disable_all_user_from_sitemap( $provider, $name ) {
    if ( 'users' === $provider ) {
        return null;
    }
    return $provider;
}
add_filter( 'wp_sitemap_add_provider', 'disable_all_user_from_sitemap' );

functions.php に書くのは簡単ですが、テーマの領域で制御することはおすすめしません。テーマを切り替えるとこの設定も再度追加する必要があるためです。よりよい方法は、このフックを使う公式プラグインを探すか、プラグインを自作するのがよいでしょう。

プラグイン にする例

class DisableSitemapUser {
    function __construct() {
        add_filter( 'wp_sitemap_add_provider', array( $this, 'disable_all_user_from_sitemap'), 99, 2 );
    }

    public function disable_all_user_from_sitemap( $provider, $name ) {
        if ( 'users' === $provider ) {
            return null;
        }
        return $provider;
    }
}

その他のフック

とりあえずサイトマップの ON/OFF ができれば大抵の目的はクリアできるとおもいますが、他にもいくつかフックが用意されています。たとえば以下の2つは、WP_Post や WP_User が引数にとれるフィルターフックが用意されているので、用途が思いつかないくらい細かな出し分けが可能です。

wp_sitemaps_posts_entry( $sitemap_entry, $post, $post_type ) フィルター

$sitemap_entry => サイトマップ用の記事データ(lastmod や priority とかが入ってる)
$post => WP_Post オブジェクト
$post_type => 投稿タイプの配列
使い所: 投稿名・投稿日・最終更新日などでサイトマップを出し分けたい時

wp_sitemaps_users_entry( $sitemap_entry, $user ) フィルター

$sitemap_entry => サイトマップ用の記事データ
$user => WP_User オブジェクト
使い所: ユーザー名やユーザーの権限で各人のサイトマップを出し分けたい時

ユーザー名が公開されることによるリスク

そもそもユーザー名が公開されると、どんな時に困るのでしょうか。

  • ログインに必要なユーザー名とパスワードのうち、ユーザー名が割れてしまう
  • ユーザー名が個人情報由来の場合、誰かを推測されてしまう

どちらもひとまとめにして「気持ち悪い」と片付けられる場合がありますが、前者はセキュリティ面で、後者は精神的なリスクや業務戦略上のリスクがあります。

セキュリティ面では、ユーザー名が公開されていてもパスワードが十分に難解で長いパスワードであればそれほど脅威ではありません。例えば iAhJlDMgF8s(L6P1Hp2w7^eP みたいなパスワードです。

私としては、名前が推測されてしまうのが嫌なので無効化しますが、業務では「気持ち悪い」というあやふやな理由は避けたほうがいいですね。リスクと対策を淡々と検討するようにしましょう。

脆弱性診断で突っ込まれた場合

さて、このXMLサイトマップについて、商用サイトで業者の脆弱性テスト・侵入テストを行った場合に「ユーザー名が見えている」と修正の指摘が来る可能性があります。

ユーザー名を公開していることがサイトの運用上必須の場合は、セキュリティ不安が無いことを説明して修正を行わない選択をすることも可能です。サイトの運用上必須である例は、著者のアーカイブページがサイトの機能として存在する場合などです。例えば以下のような施策を行って担当者に説明を行います。

  • パスワードポリシーを決める(例: 英数記号大文字小文字混じり必須で12文字以上)
  • すべてのユーザーに対してパスワードポリシーに従ったパスワードを適用する
  • すべてのユーザーに対してパスワードポリシーが適用されてたエビデンスを提示
    (例) 人の手で変更する場合は、変更した各人によるチェックリスト
    (例) スクリプトで機械的に変更した場合は、そのロジックと実行結果(変更済みのパスワードの平文を提示する必要はない)

もちろん、この方法は工数が発生して単純に面倒ですし、既存の運用に影響を与えるリスクもあります。なので、このような施策とエビデンスを得ることが難しければ、業者・セキュリティ担当者の言うまま組み込みサイトマップ XML を無効化してしまうのが楽でしょう。