html <a>タグの target="_blank"のセキュリティ
対象読者
解決すること
内容
html で <a> タグって頻繁に使うと思いますけど、今のページをそのまま残して別タブにリンクページを開きたい場合、target="_blank" を付けますよね。これをやるとセキュリティ的に問題があるそうで(mdn web doc)
危険な例:
<a
href="/hogehoge"
target="_blank"
>
hogehoge
</a>
新しいタブのページに、window.opener
で元のページが参照できたってことで、これに window.opener.location = ...
とかやられたりすると、元のページを表示してたタブに勝手に危ないサイトを表示されてしまう可能性があるらしい。何故読み取り専用にしておかないのかとか、通信したいならもっと別なやり方あるだろうとか色々思うけれども、昔はそんなこと思いもしなかったんだろなぁ...。
以下が対応した例:
<a
href='/hogehoge'
target="_blank"
rel="noopener noreferrer"
>
hogehoge
</a>
上の様に、rel="noopener noreferrer"
をつける。noopener
は、window.opener
へのアクセスを出来なくさせる。noreferrer
は、参照元のページを参照させなくする。
上のmdn のドキュメント にも書いてあるけれど、
target="_blank"
をrel="noreferrer"
やrel="noopener"
なしで使用すると、ウェブサイトがwindow.opener
API 搾取攻撃を受けやすくなりますが、新しい版のブラウザーではtarget="_blank"
を設定すると、rel="noopener"
と同じ保護が提供されます。詳しくはブラウザーの互換性を参照してください。
だそうだ。セキュリティの話だから新しいブラウザが対応していても対応は必須ですが。
ちなみに、このブログのCMSである microCMS のリッチテキストエディタのリンクでは、ちゃんと noreferrer
も noopener
も付いていました。