外部リンク

a target=_blank, rel=noopener noreferrer

target="_blank" で新しいタブに開く外部リンクを作成できる。セキュリティのため rel="noopener noreferrer" の併用が必須。

外部リンクのデモ

target="_blank"rel="noopener noreferrer" を組み合わせた外部リンクの例。アイコンや視覚的な手がかりでユーザーに新タブで開くことを伝えるのが推奨される。

基本的な外部リンク

詳細は MDN Web Docs を参照してください。

新しいタブアイコン付き外部リンク

GitHub(新しいタブで開く)

ボタン風外部リンク

公式サイトを開く
<!-- 基本形: rel="noopener noreferrer" は必須 -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
  外部サイト
</a>

<!-- アクセシビリティ: 新タブで開くことをスクリーンリーダーに伝える -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
  外部サイト
  <span class="sr-only">(新しいタブで開く)</span>
</a>

/* スクリーンリーダー専用テキスト */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
}

セキュリティ: タブナビング攻撃とは

rel="noopener noreferrer" を付けない場合、リンク先のページが window.opener を通じて元のページを操作できる脆弱性(タブナビング)が発生する。

危険: rel なし

<a href="https://malicious.example" target="_blank">リンク</a>

// リンク先の悪意あるページが実行できること:
window.opener.location = "https://phishing.example";
// → 元タブを偽サイトにリダイレクト可能!

安全: rel="noopener noreferrer" あり

<a href="https://example.com" target="_blank"
   rel="noopener noreferrer">リンク</a>

// window.opener は null になり、
// 元のページへのアクセスが不可能になる
<!-- noopener: window.opener を null にする -->
<!-- noreferrer: Refererヘッダーを送信しない(noopenerも含む) -->
<a href="https://example.com"
   target="_blank"
   rel="noopener noreferrer">外部リンク</a>

/* 現代のブラウザでは target="_blank" に自動で noopener が付与されるが、
   明示的に書くことで古いブラウザでも安全になる */

target 属性の値

target 属性はリンク先をどのコンテキストで開くかを指定する。

_blank

新しいタブ(またはウィンドウ)で開く。最もよく使われる。rel="noopener noreferrer" を必ず付ける。

_self

現在のタブで開く(デフォルト動作)。target属性を省略した場合と同じ。

_parent

親フレーム(iframe の親)で開く。フレームなし環境では _self と同様。

_top

最上位のブラウジングコンテキストで開く。フレームを全て無効化して遷移する。

<!-- 新しいタブで開く -->
<a href="#" target="_blank" rel="noopener noreferrer">新しいタブ</a>

<!-- 現在のタブで開く(デフォルト) -->
<a href="#" target="_self">現在のタブ</a>

<!-- 親フレームで開く -->
<a href="#" target="_parent">親フレーム</a>

<!-- 最上位コンテキストで開く(全フレームを破壊) -->
<a href="#" target="_top">最上位</a>

referrerpolicy 属性

referrerpolicy 属性でリンク遷移時に送る Referer ヘッダーを細かく制御できる。rel="noreferrer" より詳細な設定が可能。

送信内容
no-referrerReferer を一切送らない
originオリジン(scheme + host + port)のみ送る
strict-origin-when-cross-origin同一オリジン時はフルURL、クロスオリジン時はオリジンのみ(デフォルト)
no-referrer-when-downgradeHTTPS→HTTP の場合は送らない、それ以外はフルURL
unsafe-url常にフルURLを送る(非推奨)
<!-- Refererを送らない -->
<a href="#" referrerpolicy="no-referrer">リンク</a>

<!-- オリジンのみ送る -->
<a href="#" referrerpolicy="origin">リンク</a>

<!-- rel="noreferrer" は referrerpolicy="no-referrer" と同等 + noopener も含む -->
<a href="#" target="_blank" rel="noopener noreferrer">リンク</a>

比較表: target 属性の値

開く場所rel="noopener" 必要主な用途
_blank新しいタブ / ウィンドウ必須外部リンク、PDF、別サービスへの遷移
_self現在のタブ(デフォルト)不要通常のページ内遷移
_parent親フレーム状況によるiframe 内からの遷移
_top最上位コンテキスト状況によるフレームを全て抜け出した遷移

Tips: rel="noopener noreferrer" はセキュリティの必須対策

  • target="_blank" を使う際は 必ず rel="noopener noreferrer" を付ける。これが最も重要なルール。
  • noopener: リンク先ページから window.opener 経由で元ページを操作できなくする(タブナビング防止)。
  • noreferrer: Referer ヘッダーを送らないことに加え、noopener の効果も含む。両方書くのは後方互換性のため。
  • NEWモダンブラウザ(Chrome 88+, Firefox など)では target="_blank" に自動的に noopener が適用されるが、明示的に書くことで古いブラウザでの安全性も確保できる。
  • 外部リンクには視覚的なインジケーター(外部リンクアイコン)を付け、ユーザーが新しいタブで開くことを事前に把握できるようにするとアクセシビリティが向上する。

🤖 AIプロンプトテンプレート

以下の要件を満たす、外部リンクのHTML・CSSサンプルを作成してください。

- `target="_blank"` と `rel="noopener noreferrer"` を必ず組み合わせること
- 外部リンクであることを示すアイコン(SVGまたは Unicode)を付与すること
- `rel="noopener"` が防ぐセキュリティリスク(タブナビゲーション攻撃)を説明すること
- `rel="noreferrer"` がリファラー情報を送信しない効果も説明すること
- スクリーンリーダー向けに「新しいタブで開く」旨を `aria-label` で伝えること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。