クリックジャッキングは、信頼できる身近なサイトのように見えるサイト上のリンクや UI 要素をクリックするようユーザーをだます悪意のある攻撃です。これは通常、<iframe>
を使用して信頼できるサイトの一部またはすべてを悪意のあるサイトに埋め込むことで実現されます。
X-Frame-Options
(XFO)ヘッダーと Content-Security-Policy
(CSP)ヘッダーの frame-ancestors
ディレクティブを使用すると、サイトを <iframe>
内に埋め込む方法を制御することで、クリックジャッキング攻撃を軽減できます。
Lighthouse 監査が失敗する仕組み
XFO ヘッダーが SAMEORIGIN
または DENY
で設定されているか、CSP ヘッダーに frame-ancestors
ディレクティブが設定されている場合、監査は合格となります。これらのフレーム制御ポリシーのどちらも構成されていない場合、監査は失敗します。
クリックジャッキングの軽減にフレーム制御ポリシーを設定する方法
最初のドキュメント リクエストの HTTP ヘッダーにフレーム制御ポリシーを設定する必要があります。<meta>
要素に設定した場合、X-Frame-Options
ヘッダーと Content-Security-Policy
の frame-ancestors
ディレクティブは機能しません。
XFO ヘッダー
XFO ヘッダーに DENY
または SAMEORIGIN
を設定すると、クリックジャッキング攻撃を軽減できます。
X-Frame-Options: SAMEORIGIN
X-Frame-Options: DENY
SAMEORIGIN
ディレクティブは、すべての祖先フレームがページ自体と同じオリジンを共有している場合にのみ、ページを表示できるようにします。一方、DENY
ディレクティブは、親フレームのオリジンに関係なく、ページがフレームに表示されないようにします。
CSP ヘッダー
CSP ヘッダー内の frame-ancestors
ディレクティブは、特定のページを <frame>
、<iframe>
、<object>
、<embed>
に埋め込むことができるサイトを定義します。XFO と同様に、CSP frame-ancestors
ディレクティブを self
または none
に設定することで、クリックジャッキング攻撃を軽減できます。
Content-Security-Policy: frame-ancestors 'self';
Content-Security-Policy: frame-ancestors 'none';
ただし、frame-ancestors
ディレクティブは、ページを埋め込む可能性のある特定の親ソースを設定できるため、XFO よりも柔軟性があります。
Content-Security-Policy: frame-ancestors 'self' https://example.com;