<a>タグのターゲット属性をtarget=”_blank”とするとどうなるか?
新しいタブまたはウィンドウで開く
ユーザーがtarget="_blank"
を指定されたリンクをクリックすると、遷移先のページが新しいタブまたはウィンドウで開きます。元のページはそのまま残ります。
タブやウィンドウのフォーカス
ブラウザは新しいタブやウィンドウを開いた際に、そのタブやウィンドウにフォーカスを与えるため、ユーザーは新しいコンテンツに直ちにアクセスできます。
リファラ情報の送信
通常、新しいタブやウィンドウで開いたリンクのリファラ情報は送信されません。これにより、元のページのURLや情報がリンク先に知られることはありません。
ターゲット属性 target=”_blank” のセキュリティ上のリスクについて
リンク先のコンテンツやスクリプトをコントロールされる可能性がある
target="_blank"
を使用すると、リンク先のウィンドウやタブを開くため、攻撃者はリンク先のコンテンツやスクリプトをコントロールする可能性があります。攻撃者が自分のページを開いてユーザーの情報を盗むスクリプトを埋め込むことが考えられます。
例えば、以下のような攻撃が考えられます。
クリックジャッギング
クリックジャッギング攻撃では、攻撃者は透明なフレームや不可視のフレーム(iframe)を用意して、ユーザーがクリックしたつもりのコンテンツを攻撃者が用意したコンテンツに重ねて配置します。ユーザーが透明な領域をクリックしたとき、実際には不正なコンテンツがクリックされることになり、攻撃が実行されます。これにより、攻撃者はユーザーに意図しないアクションを実行させることができます。
クリックジャッギングについては下記でも投稿しています。
クリックジャッギング攻撃とは、ウェブサイト内のコンテンツを透明なフレームや不可視のフレームに表示し、ユーザーが意図しないクリックを引き起こす攻撃手法です。クリックジャッギング攻撃を防ぐためには、適切なセキュリティーヘッダーの設定が必要です。
ターゲット属性の悪用
<a>タグのターゲット属性を"_blank"
に設定すると、リンク先のコンテンツが新しいウィンドウやタブで開かれます。この際、攻撃者がコントロールするウェブページを開くことで、悪意のあるスクリプトを実行させる可能性があります。攻撃者は開かれたウィンドウ内でユーザーの情報を盗む、フィッシング攻撃を行う、マルウェアを配信するなどの攻撃を行うことができます。
リダイレクト
攻撃者は正当なウェブサイトと見せかけて、実際には悪意のあるウェブページにリダイレクトさせることがあります。ユーザーがリンクをクリックした際、新しいウィンドウやタブで開かれるリンク先が攻撃者の制御下にある場合、ユーザーが意図しない攻撃にさらされる可能性があります。
Window.opener の攻撃
target="_blank"
を使用すると、開いたウィンドウ内でwindow.opener
を使用して元のウィンドウにアクセスできます。攻撃者が悪意のあるウェブページを開いた後、元のウィンドウに対してスクリプトを実行し、セッション情報などの機密データを盗む攻撃が考えられます。
target="_blank"
を使用して新しいウィンドウやタブでリンク先のページを開くと、元のウィンドウと新しく開かれたウィンドウ(またはタブ)との間に親子関係が成立します。この親子関係が成立することで、新しいウィンドウ内の JavaScript コードから元のウィンドウにアクセスできる状況が生まれます。
この状況において、window.opener
というプロパティは、新しく開かれたウィンドウ内から元の親ウィンドウへのアクセスを提供します。この提供によって、元のウィンドウの DOM 要素を操作したり、データのやり取りを行ったりすることが可能になります。
この仕組みは一般的には便利な機能ですが、悪意のある攻撃者がこれを悪用してユーザーの情報を窃取したり、不正な操作を行ったりする可能性が出てきます。
ポップアップ広告の濫用
target="_blank"
リンクを悪用して、ポップアップ広告や不正なコンテンツをユーザーに表示する攻撃が考えられます。
ターゲット属性 target=”_blank” のセキュリティ上のリスクと対策
基本的な対策について
リンク先は信頼できるページでしょうか?。信頼できないページにtarget="_blank"
を使用するのは控えましょう。
リンク先のウェブサイトはHTTPSを使用していますか?
ポップアップ広告や不正なコンテンツが表示されないページですか?
rel="noopener
noreferrer
"
属性をリンクに追加する
target="_blank"
と一緒にrel="noopener
noreferrer
"
を追加することで新しいウィンドウやタブでリンク先を開いた際のセキュリティ上のリスクを軽減することができます。
rel="noopener"
について
rel="noopener"
属性は、リンク先のウィンドウを開いた際に、元のウィンドウとの関連性を切断します。これにより、リンク先が元のウィンドウを操作することを防ぎ、悪意あるスクリプトによる攻撃(特にwindow.opener
攻撃)を防ぐことができます。
rel="noreferrer"
について
rel="noreferrer"
属性は、リンク先へのリファラ情報(どのページからリンクがクリックされたか)をリンク先に伝えないようにします。これにより、ユーザーのプライバシーを保護し、リンク先がユーザーのアクティビティを追跡するのを防ぐことができます。
まとめ
今回の記事ではaタグのターゲット属性target="_blank"
の挙動やセキュリティ上のリスクと対策について解説しました。実際の案件をやっていると特に古いサイトなどでtarget="_blank"
だけの指定になっているリンクを確認します。
target="_blank"
だけではなくrel="noopener
noreferrer
"
も追加しましょう。
他のセキュリティ関連の記事
httpsで接続しているのに、URLの前に「!マーク」が表示される原因は「Mixed Content」です。「Mixed Content」になってしまう原因と解決方法について記事を書いています。