[HTML] aタグ 別タブで開く方法とセキュリティ対策
a タグで作ったリンクを新しいタブで開くには、 target="_blank"
を指定するが、 target="_blank"
には脆弱性が存在する。脆弱性に対応したリンクを別タブで開く方法。
リンクを新しいタブで開く方法
リンクをどうやって開くかは target
属性を使って指定する。新しいタブで開くには target
属性の値を _blank
にする。
<a href="リンク先のURL" target="_blank" rel="noopener noreferrer">新しいタブで開く</a>
target
属性のその他の値target="_self"
: 現在のウィンドウで開く(デフォルト値)target="_parent"
: 親ウィンドウで開くtarget="_top"
: 最上位のウィンドウで開く
target="_blank"
の脆弱性
target="_blank"
には脆弱性があり、 Tabnabbing という方法を使ってフィッシング詐欺に使われる可能性がある。
リンク先である子ページから、リンク元である親ページを操作することができる。子ページから、 window.opener.location = newURL
を実行すると、親ページは newURL
に遷移する。
例えば、 target="_blank"
によって開かれた子ページで、デベロッパーツールのコンソールに、 window.opener.location = "https://www.yahoo.co.jp/"
と打って enter を押すとヤフーに遷移することを確認できる。
リンク先に window.opener.location
を埋め込んで、親ページに戻ると 「 Google へ再ログインしてください。」というあたかも Google を装った偽ページを表示させ、ログイン情報を不正に入手するということができてしまう。
( Google ってログインしっぱなしで使っていると、キャッシュ消した後とか(?)突然ログインページが表示されることあるよね?!)
この方法を使った攻撃を Tabnabbing (タブナビング)という。
Tabnabbing 対策
これを防ぐには rel="noopener noreferrer"
を一緒に指定する。
<a href="リンク先のURL" target="_blank" rel="noopener noreferrer">新しいタブで開く</a>
noopener
を指定すると、リンク先から window.opener
が参照できなくなる( null
になる)。さらに、リンク元とリンク先が別スレッド扱いになるためパフォーマンスの面でも良い効果がある。
ブラウザによっては、 noopener
がサポートされていないので、あわせて norefferer
を指定する。
norefferer
を指定すると、リンク先に、リンク元のリンクが送られないようになる。
rel="noopener noreferrer"
のついた子ページで、デベロッパーツールのコンソールから、 window.opener.location = "https://www.yahoo.co.jp/"
を実行すると、
Uncaught TypeError: Cannot set property 'location' of null atというエラーが出て親ページは遷移できなくなる。:1:24