WordPress コメント投稿者リンクの安全な扱い:URL・rel・アクセシブルな新規タブ

2026 年メンテナンス注記: この記事は、コメント投稿者リンクの安全ガイドとして更新しました。末尾には出典確認用に 2011 年の全文を残していますが、そこにあるオープンリダイレクト、リファラー判定、文字列置換、コアファイル編集は実行しないでください。

先に結論

ほとんどのサイトでは、コメント投稿者の Web サイト用に中継リダイレクトを作る必要はありません。モデレーターが確認した URL を WordPress に直接サニタイズ・エスケープして出力させ、既定では現在のタブで開く方法が、通常は最も単純で安全です。

ユーザーが送信した URL を ?r=?to= に入れ、自サイト経由で転送しないでください。このような公開エンドポイントは、自サイトのブランドをフィッシングやスパムの踏み台にします。HTTP_REFERER の確認でも直りません。リファラー情報は存在しないことも、プライバシー機能で短縮されることも、偽装されることもあります。esc_url() は出力のエスケープには適していますが、任意の外部宛先を信頼済みにするものではありません。`wp_safe_redirect()` は安全なローカルリダイレクトのための関数であり、ユーザー制御の外部 URL を許可するためのものではありません。

選択肢と境界

要件推奨する方法使用しない方法
コメント投稿者のサイトを表示するWordPress コアが生成する直接リンクを使い、投稿者 URL をモデレートする公開オープンリダイレクト
コメントスパムとリンク操作を減らすモデレーションとリンク数制限を有効にし、ugc を使う。サイト方針に応じて nofollow を追加する外部リンクを自サイトのリダイレクトで偽装する、「リンク評価は流出しない」と考える
新しいタブで開く実証された利用者ニーズがある場合だけ、対応フィルターで生成済みの <a> を変更し事前に通知するコア編集、HTML 全体への str_replace()
コメント本文のリンクを扱うWordPress 標準のフィルタリング、許可 HTML、モデレーションを使うcomment_text 全体の href を一括置換する

コメント投稿者の Web サイトは公開フィールドです。コメントのメールアドレス、IP アドレス、モデレーショントークン、追跡パラメーターを含む管理リンクは公開情報ではありません。公開 URL、フロントエンド HTML、スクリーンショット、診断ログにこれらを入れないでください。未成年者向け、規制対象コミュニティ、保存義務のある組織では、先にプライバシーとコンプライアンスの境界を決めます。

安全な基準:直接リンクとモデレーション

  1. ステージング環境で完全なバックアップを取り、使用中のテーマ、コメントプラグイン、キャッシュ/CDN、コメントページの HTML を記録します。古い ?r=/?to= エンドポイント、HTTP_REFERER 判定、comment_text の文字列置換、wp-includes 内の編集を検索します。
  2. WordPress、テーマ、コメントプラグインを更新します。変更されたコアファイルを元に戻します。`wp core verify-checksums` はコアの差分発見に役立ちますが、バックアップや人による確認の代わりにはなりません。
  3. 「設定 → ディスカッション」とコメント画面で、コミュニティのリスクに合うモデレーションを設定します。疑わしい、タイポスクワッティング、短縮、認証情報付き、不要な追跡付きの投稿者 URL はクリックせず、URL またはコメントを消去・拒否します。
  4. テーマから WordPress のコメント投稿者 API を呼び出します。現在の `get_comment_author_link()` は URL を出力用にエスケープし、リンクの rel を構成します。テンプレート内で未エスケープの comment_author_url からリンクを組み直さないでください。
  5. 旧リダイレクト処理をまずステージングで無効化し、アクセスログで依存を確認してから、一つの限定変更として公開します。旧エンドポイントを任意宛先へのリダイレクトとして残さないでください。外部依存がある場合は、セキュリティ責任者が固定宛先への移行または明確な廃止応答を定義します。

WordPress のコメントディスカッション設定コメントモデレーションの各ガイドが、公開フィールド、承認待ちキュー、リンク数しきい値の出発点です。モデレーションはリスクを減らしますが、宛先が将来も安全だと証明するものではありません。

rel は関係を表すもので、SEO の魔法ではない

WordPress 6.2 以降は、コメント投稿者リンクの rel トークンをフィルターする `comment_author_link_rel` を提供します。現在のコアはユーザー生成コンテンツに ugc を追加し、リンクが内部か外部かに応じて関係を構成します。Google もコメントやフォーラムのユーザーリンクに `rel="ugc"` を推奨しています。サイトが宛先との関連付けを避ける場合は nofollow を併用できます。

通常、コードの追加は不要です。サイト方針で全投稿者リンクに ugc nofollow の両方が必要な場合は、コアを編集せず、停止可能な小さなサイト専用プラグインで次の WordPress 6.2+ フィルターを使います。

add_filter(
    'comment_author_link_rel',
    static function ( array $rel_parts ): array {
        $rel_parts[] = 'ugc';
        $rel_parts[] = 'nofollow';

        return array_values( array_unique( $rel_parts ) );
    },
    10,
    1
);

先に実際の WordPress バージョンと、他プラグイン適用後の出力を確認してください。nofollow/ugc はリンク関係のヒントであり、スパム対策、プライバシー隔離、アクセス制御ではありません。リンクをローカルリダイレクトの背後に隠し、robots.txt でブロックしても、オープンリダイレクトは安全にならず、順位や「リンク評価の維持」も保証されません。Google のスパムに関するポリシーも参照してください。

新しいタブは任意であり、事前通知が必要

現在のタブと通常の「戻る」ボタンを保つ方が、一般には予測しやすい動作です。調査と利用者の反応から本当に新規タブが必要な場合、WCAG 達成方法 G201は新しいウィンドウを開く前の警告を求めます。次の例は WordPress 6.2+ 専用で、`WP_HTML_Tag_Processor` により属性を変更し、コア既存の rel を保ち、視覚表示とアクセシブルネームの両方で通知します。

add_filter(
    'get_comment_author_link',
    static function ( string $link, string $author ): string {
        if ( ! class_exists( 'WP_HTML_Tag_Processor' ) ) {
            return $link;
        }

        $tags = new WP_HTML_Tag_Processor( $link );

        if ( ! $tags->next_tag( 'a' ) ) {
            return $link;
        }

        $rel_parts = preg_split(
            '/[[:space:]]+/',
            trim( (string) $tags->get_attribute( 'rel' ) )
        );
        $rel_parts = is_array( $rel_parts ) ? $rel_parts : array();
        $rel_parts = array_values(
            array_unique(
                array_filter(
                    array_merge( $rel_parts, array( 'noopener', 'noreferrer' ) )
                )
            )
        );

        $notice = __( 'opens in a new tab', 'site-comment-links' );

        $tags->set_attribute( 'target', '_blank' );
        $tags->set_attribute( 'rel', implode( ' ', $rel_parts ) );
        $tags->set_attribute(
            'aria-label',
            sprintf(
                /* translators: %s: comment author name. */
                __( '%s (opens in a new tab)', 'site-comment-links' ),
                wp_strip_all_tags( $author )
            )
        );

        return sprintf(
            '%1$s <span class="comment-link-new-tab-notice" aria-hidden="true">(%2$s)</span>',
            $tags->get_updated_html(),
            esc_html( $notice )
        );
    },
    20,
    2
);

この二つの英語文字列をサイト専用プラグインの翻訳カタログに追加します。noreferrer は宛先への参照元ページ開示を減らしますが、分析データも変えます。公開前にプライバシーと分析の担当者が承認してください。WordPress 6.1 以前への対応が必要でも、文字列置換へ戻さずアップグレードを優先します。

古い手法が安全でない理由

  • ユーザー制御のリダイレクト先: 自サイトのドメインが任意の宛先を保証する形になり、フィッシング、スパム、リンク検査回避に悪用されます。構文のサニタイズは宛先の認可ではありません。業務上どうしても必要なら、セキュリティチームが少数の固定・審査済み宛先をサーバー側で対応付けます。
  • リファラーによるゲート: HTTP_REFERER は認証・認可シグナルではありません。欠落することも、機密パスを漏らすことも、偽装されることもあるため、正規利用者を拒否しながら攻撃者を止められません。
  • HTML への str_replace() タグ境界を理解しないため、コメント本文、内部リンク、引用符、エンコード済み属性、リンクでないテキストまで書き換え、属性の重複や破損を作り得ます。専用フックと HTML パーサーを使います。
  • WordPress コアの編集: 更新で上書きされ、パッチ監査と障害時ロールバックも難しくなります。WordPress のプラグイン基礎は、拡張経路としてフックを説明しています。
  • 「リンク評価」という神話: リダイレクトは宛先との関係を自動的に消さず、robots.txt もセキュリティ境界ではありません。実際のモデレーション、コメントスパム対策、ユーザー生成リンクの正確なラベル付けに注力します。

検証、公開、ロールバック

ステージングで最低限、承認済み・承認待ち・スパム・削除済みコメント、空・内部・通常 HTTPS・IDN/同形異義・短縮・クエリ付き・拒否対象スキームの URL、ログイン/ログアウト状態、デスクトップ/モバイルテーマ、キーボード・スクリーンリーダー・フォーカス動作、キャッシュ/CDN、feed、REST API、管理画面を確認します。ブラウザー開発者ツールでは、直接かつ正しくエスケープされた href、期待する rel、既定でリダイレクト用クエリがないことを確認します。

変更は一度に一つだけ公開し、デプロイ記録を保持します。4xx、旧リダイレクトへのアクセス、モデレーションキュー、利用者報告を監視します。ログは必要な項目だけを保持し、共有前に完全なクエリ文字列、メールアドレス、IP、トークン、投稿者の個人情報を除去します。ループ、宛先の書き換え、プラグイン競合、アクセシビリティ低下が起きる、または旧エンドポイントから任意の外部サイトへまだ遷移できる場合は、サイト専用プラグインを直ちに無効化/前版に戻し、キャッシュを消去して WordPress またはセキュリティ責任者へエスカレーションします。

公式資料

歴史的原文アーカイブ(実行禁止)

以下は 2011 年ソースエクスポートの可視本文全文で、行末空白のみ正規化しています。利用可能だった二種類の宛先だけを狭く置換しました。サイト URL は [REDACTED: historical site URL]、オープンリダイレクト URL は [REDACTED: historical open-redirect URL] です。このサイトの Markdown エンジンで全文を一つの惰性コードフェンス内に保つため、原文の二つの内側三連バッククォートへ、それぞれ一つのゼロ幅区切り文字を挿入しました。表示テキストは変わりません。その他の本文は書き換えていません。コードにはオープンリダイレクト、認可されていない外部転送、脆弱なリファラー判定、コアファイル編集が含まれます。コピー、実行、デプロイしないでください。

`​``
WordPress评论者链接重定向跳转并在新窗口中打开
`​``

**一:评论者链接重定向:**

细心的朋友可能会注意到,在一些[wordpress博客]([REDACTED: historical site URL])上,当随便打开一篇文章,鼠标放在任意一个评

论者上,浏览器状态栏显示的地址为:[[REDACTED: historical open-redirect URL]]([REDACTED: historical open-redirect URL])的形式,打开以后仍是转到评论者的网站上。再观察你的站上面的评论链接,评论者链接直接就显示为评论者的链接。结果都一样,

有什么区别呢?从一定程度上讲默认的这种链接每一个评论都是一个外链,会分散站点的权重,就跟我们前文中所讲不要让友情链接在所有页面都显示是同样的道理,修改为重定向之后效果会好一些。

方法:在主题目录的functions.php的适当位置添加如下代码:

> //comments link redirect
>  add_filter(‘get_comment_author_link’, ‘add_redirect_comment_link’, 5);
>  add_filter(‘comment_text’, ‘add_redirect_comment_link’, 99);
>  function add_redirect_comment_link($text = ”){
>  $text=str_replace(‘href=”‘, ‘href=”‘.get_option(‘home’).’/?r=’, $text);
>  $text=str_replace(“href='”, “href='”.get_option(‘home’).”/?r=”, $text);
>  return $text;
>  }
>  add_action(‘init’, ‘redirect_comment_link’);
>  function redirect_comment_link(){
>  $redirect = $_GET[‘r’];
>  if($redirect){
>  if(strpos($_SERVER[‘HTTP_REFERER’],get_option(‘home’)) !== false){
>  header(“Location: $redirect”);
>  exit;
>  }
>  else {
>  header(“Location: [http://你的网址/”); ](http://你的网址/%22);)exit;
>  }
>  }
>  }

当然 ,如果你还有特殊需求,也可以重定向控制评论框中的文本的URL链接。
**二:评论链接新窗口打开:**

WordPress默认的评论者链接都是在同一个窗口中打开的,访客点击评论者链接之后就离开了你的站,

也就没有了回头客,很多时候流量就是在这个时候丢失的。

方法:在wp-includes/comment-template.php中增加一个target=‘_blank’语句。

即在这段代码:

> if ( empty( $url ) || ‘http://’ == $url )
>  $return = $author;
>  else
>  $return = “<a rel=”external nofollow” href=”$url”>$author</a>”;
>  return apply_filters(‘get_comment_author_link’, $return);

中的第一句rel=”external nofollow”后面增加一个target=”_blank”。
 最后,建议在robots.txt中增加一行:Disallow: /?r=* 告诉搜索引擎不要抓取此页面,至此整个修改已经大功告成,刷新浏览器所见即所得。

Leave a Reply