rel=”noopener”とrel=”noreferrer”の違い
目次
概要
aタグにref=noopener
を指定するとESLintで怒られたので改めて設定と、noopener
とnoreferrer
の違いをまとめておく。
ESLint
Disallow target="_blank"
attribute without rel="noreferrer"
ルールの詳細
This rule aims to prevent user generated link hrefs and form actions from creating security vulnerabilities by requiring
rel='noreferrer'
for external link hrefs and form actions, and optionally any dynamically generated link hrefs and form actions.DeepL) このルールは、外部リンクとフォームアクション、およびオプションで動的に生成されるリンクとフォームアクションに rel='noreferrer' を要求することで、ユーザが生成したリンク href とフォームアクションがセキュリティの脆弱性を生み出すのを防ぐことを目的としています。
https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md
現在の主要ブラウザでは自動的にref=noopener
が設定されているためIE等のレガシーブラウザのサポートが必要ない場合はこの設定は不要になる。
また外部リンク先が安全だと保証されている場合や、分析等で使用したい場合は設定でallowReferrer
をtrue
にすることでnoreferre
を必須としない設定にできる。
そもそもrefの設定はなぜ必要か
target=_blank
を使用して別サイトのページへアクセスした場合下記の問題が発生するリスクがある。
-
セキュリティの問題
-
サイトパフォーマンスの問題
セキュリティの問題
window.openerを使用して遷移元のwindowオブジェクトにアクセスし悪意のある行為をされる可能性がある
例えば、遷移先で悪意のあるJavaScriptソースが仕込まれていて、元ページに似せたフィッシングサイトにリダイレクトさせたり...など
サイトパフォーマンスの問題
遷移先ページでも遷移元のページと同じプロセスでリソースが実行される場合があり、不要なJavaScriptなどが実行されパフォーマンスの低下を可能性がある
参考
noopenerとnoreferrerの違い
noopener
-
遷移先で元のサイト(遷移元)の
window.opener
へのアクセスを許可しない(nullを返す) -
HTTPのRefererヘッダーは提供される
-
古いブラウザではサポートされていない(ref: Can I use)
仕様書 : 4.6.7.13 Link type "noopener
"
noreferrer
-
noopener
の作用と同様 -
参照先でHTTPのRefererヘッダーを省略し(referer)情報を渡さない様にブラウザに指示する
仕様書 : 4.6.7.14 Link type "noreferrer"
Refererとは
Referer
リクエストヘッダーには、現在リクエストされているページへのリンク先を持った直前のウェブページのアドレスが含まれています。Referer
ヘッダーにより、サーバーは人々がどこから訪問しに来たかを識別し、分析、ログ、キャッシュの最適化などに利用することができます。https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referer