【実務・中級編】target=_blank使用時のセキュリティ対策 – HTML実践ガイド

「別タブで開く」リンクに潜む罠。今すぐ `rel=”noopener”` を入れるべき技術的理由

フロントエンドの現場で、ふとした瞬間に「あ、これまだやってなかったな」と冷や汗をかくことはありませんか?その一つが、何気なく書いている `` です。

「別タブで開く」というUIはUXの文脈で議論が分かれるところですが、実装するならば、現代のWebエンジニアとして最低限守らなければならない「セキュリティの鉄則」があります。今回は、なぜ `rel=”noopener”` や `rel=”noreferrer”` が必須なのか、ブラウザの裏側で何が起きているのかを深掘りします。

なぜ `target=”_blank”` は危険なのか?

結論から言うと、最大の理由は「リンク先ページから、リンク元ページを操作できてしまう」という脆弱性にあります。

`target=”_blank”` を使って新しいタブを開くと、ブラウザは新しいページに対して `window.opener` というプロパティを付与します。これを通じて、リンク先(新しいタブ)のJavaScriptから、リンク元(元のタブ)のオブジェクトにアクセスできてしまうのです。

実際に起きること

1. あなたのサイトから、悪意のある外部サイトへ `target=”_blank”` でリンクする。
2. 悪意のあるサイト側で、`window.opener.location.href = ‘https://phishing-site.com’` のようなスクリプトを走らせる。
3. ユーザーが元のタブに戻ったとき、そこには見覚えのないフィッシングサイトが表示されている。

これは非常に古典的ですが、今なお有効な「UI偽装攻撃(Tabnabbing)」の一種です。ユーザーの信頼を損なうだけでなく、重大なセキュリティ事故に直結します。

ブラウザはどう処理しているのか

ブラウザの仕組みを少しだけ解剖しましょう。

`window.opener` は、リンク先ページが元のページと同じオリジン(ドメインやポート)である場合に、相互に連携を取りやすくするための仕様でした。しかし、現代のWebにおいては、外部サイトへのリンクがデフォルトでこの「特権」を持ってしまうのはリスクが高すぎます。

そこで登場するのが `rel` 属性です。

  • `rel=”noopener”`: これを付与すると、ブラウザは `window.opener` を `null` に設定します。つまり、リンク先ページは元のページを一切操作できなくなります。これが現代の標準的なセキュリティ対策です。
  • `rel=”noreferrer”`: `noopener` の機能に加え、HTTPリファラー(どのページから遷移してきたかの情報)を送信しなくなります。プライバシーをより厳重に守りたい場合に有効ですが、解析ツール(Google Analyticsなど)で参照元が見えなくなるというトレードオフがあります。

実務で使い分けるためのベストプラクティス

正直なところ、現代のWeb開発において「とりあえず `target=”_blank”` を使う」ときは、何も考えずに `rel=”noopener noreferrer”` をセットで書くのが正解です。

以下に、実務でそのまま使える安全な実装パターンを提示します。




外部サイトへ移動(安全なリンク)




参照元を計測したい外部リンク

シニアからのアドバイス:実装の自動化を検討しよう

「毎回これを書くのは面倒だし、ミスが起きそう」と思った方は、非常に真っ当な感覚の持ち主です。人間は忘れる生き物ですから、仕組みで解決しましょう。

1. ESLintの導入: `eslint-plugin-react` や `eslint-plugin-jsx-a11y` を導入していれば、`react/jsx-no-target-blank` というルールを有効にすることで、`noopener` がないコードを検知してビルド時に弾くことができます。
2. モダンブラウザの進化: 実は、現在の主要なモダンブラウザでは、`target=”_blank”` を指定すると暗黙的に `rel=”noopener”` が適用されるようになっています。しかし、古いブラウザや特定の環境を考慮する必要がある業務現場では、「明示的に書く」ことがプロとしての誠実さです。

まとめ

`target=”_blank”` を書くときは、必ず「`rel=”noopener”` を忘れていないか?」と自分に問いかけてください。

Webのセキュリティは、こうした小さな気配りの積み重ねで守られています。「動けばいい」という視点から一歩踏み出し、ユーザーの安全を設計レベルで担保できるエンジニアこそが、現場で重宝される存在です。

明日からのコーディングで、ぜひ意識してみてください。小さな一行が、ユーザーを守る大きな盾になります。

コメント

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