見えるセキュリティ
クリックジャッキング
CLICKJACKING
この概念とは?
クリックジャッキングは、利用者が見ている表示と、実際に操作する対象をずらし、意図しない操作をさせる攻撃です。この教材では、誘導用のボタンの上に、本物の設定ページを透明なiframeで重ねる例を見ます。埋め込みを制限すると、この攻撃の流れがどこで止まるかを比較します。[S01][S02]
本物のページが伝えた埋め込み制限を、ブラウザがクリック前に適用します。
- THEME
- web-vuln
- KIND
- attack
- REVIEW
- self-reviewed ·
説明用の例:ログイン済みでiframe内でも操作可能。メール通知はONから始まり、1クリックでOFFにできる設定です。
本物の設定ページの応答
https://settings.example/notifications
埋め込み条件(HTTP応答)
この例では埋め込みを止める制限なし
同じ画面位置を見比べる
利用者に見える表示
https://bait.example/offer
あなたへの特典
利用者の意図:特典を受け取る
利用者には、背面の「特典を受け取る」が見えます。
説明用の透視図
https://bait.example/offer
あなたへの特典
利用者の意図:特典を受け取る
iframeへ埋め込もうとしている
ブラウザの判断前。本物の操作UIはまだ表示しません。
ブラウザの判断:判断前
応答の条件を確認します。
クリック:未操作
本物のサービスの状態(説明用)メール通知:変更前ON/結果はSTEP4で確認
図の前提・注意点
iframeは、ページの中に別のページを表示する枠です。この例では、利用者が本物のサービスにログインしており、iframe内でも設定を操作できる条件にします。メール通知は最初ONで、OFFにする操作は1回のクリックで完了します。
要求は両モードで試みられます。HTMLの内容・ボタン位置は同じで、応答の埋め込み制限だけが異なります。制限がないことは、安全性を判断したという意味ではありません。
架空の画面を使った図解です。透視図では、実際の利用者には見えない前面の透明なiframeを可視化しています。別画面でも、攻撃者が別オリジンのDOMを読み取った情報でもありません。
埋め込みを許可した例では、透明でも前面の本物ボタンが直接クリックを受けます。背面からの転送ではありません。重なる動きは前後関係と配置を説明する演出です。ブラウザが自動で画面を移動する動作ではありません。
拒否時のエラー画面と誘導ページ側のクリック挙動は、ブラウザ差があるため再現しません。
結果はiframeの外に示した説明用の状態です。STEP3と4は説明の区切りであり、実ブラウザが結果を保留する意味ではありません。
STEP 01 / 4
本物のページから応答が届く
STEP 1 / 4: 本物のページから応答が届く
誘導ページは、本物の設定ページをiframeへ表示しようとします。この例では、本物のページの応答に埋め込みを止める制限がありません。
技術的な詳細を見る
両モードで要求が試みられ、HTML応答の情報を受け取ります。制限は埋め込まれる本物のHTMLのHTTP応答ヘッダーで伝えます。Report-Onlyやmetaではありません。[S03][S05 §6.4.2.1]
この概念の要点
要点
見える表示と、クリック対象はずらせる
透明なiframeを前面に重ねると、背面の誘いボタンを見ながら、同じ位置にある本物の操作ボタンを押してしまう場合があります。[S01][S02]
要点
本物のページが制限を送り、ブラウザが適用する
この例では、本物のページの応答にあるframe-ancestors 'none'をブラウザが確認し、iframe内への表示を拒否します。[S03][S05]
要点
読み取りの制限と、意図しない操作の防止は別
別オリジンのDOMを読めないことだけでは、この例の操作を防げません。本物の画面を操作するため、CSRFトークンだけでも防げるとは限りません。[S04][S06]
理解確認
理解確認
理解確認
クリックジャッキングの補足
埋め込み元を制限するCSP
frame-ancestorsは、どのページから自分を埋め込んでよいかを制限します。埋め込まれるHTMLのHTTP応答ヘッダーで伝えます。<meta>に書いても、このディレクティブは適用されません。[S03][S05]
| 方針 | 埋め込みの扱い |
|---|---|
frame-ancestors 'none' | どのページからも許可しない。同一オリジンも含む |
frame-ancestors 'self' | 同一オリジンからの埋め込みを許可する |
必要な埋め込みがある場合は、用途に合う許可先を限定します。多段のiframeでは、直接の親だけでなく祖先のページも確認対象です。本物のページを単独で開くことと、iframeへ埋め込むことは別です。Content-Security-Policy-Report-Onlyの方針は、表示拒否に使うContent-Security-Policyの代わりにはなりません。
既存のCSP教材で使うnonceはscript実行の許可条件です。frame-srcは「このページが枠の中へ読み込む先」、frame-ancestorsは「このページを埋め込む側」の制限で、向きが異なります。default-srcを指定するだけでもframe-ancestorsの代わりにはなりません。[S05]
X-Frame-Optionsとの関係
X-Frame-Optionsも、埋め込まれるページのHTTP応答に付けるヘッダーです。DENYは埋め込みを拒否し、SAMEORIGINは同一オリジンからの埋め込みを許可します。複数の許可先を指定したい場合は、CSPのframe-ancestorsを使う方法があります。[S01][S03]
ALLOW-FROMは現行ブラウザで使う対策として採用しません。X-Frame-Optionsを<meta>へ書く方法も有効な設定ではありません。両ヘッダーを使う場合は整合する方針にします。現行仕様では、適用されるframe-ancestorsがある応答ではX-Frame-Optionsが無視されるため、X-Frame-Optionsでその方針を上書きする説明にはしません。[S03][S05 §6.4.2.2]
SOP・CSRF対策で防げる?
SOPによる別オリジンのDOMの直接読み取り制限は、利用者がiframe内の本物の画面を操作することを一律に止める仕組みではありません。この例では、誘導ページが本物のページの内容を読み取る必要はありません。[S02][S06]
また、本物のページのボタンが操作されるため、そのページが持つ正しいCSRFトークンを使って処理が行われる場合があります。「正しいトークンがある」と「利用者がその操作を意図した」は別です。CSRF対策が不要になるという意味ではなく、画面の埋め込み制限も役割に応じて使います。[S04]
この例が成立する条件と、対策の範囲
この例は、本物のページがiframe内で表示・操作でき、利用者の認証がそこで使え、ボタンの位置が合っている条件にしています。CookieのSameSite属性等により、iframe内ではログイン状態が使えない場合があります。すべてのログイン済み利用者で成立するとは限りません。SameSiteの「site」とSOPの「origin」は判定の単位が異なるため、別オリジンというだけでは、Cookieが送られるかは決まりません。[S03][S06]
frame-ancestorsとX-Frame-Optionsは、iframe等への埋め込みを利用する攻撃への対策です。別のウィンドウを使う手法を含め、あらゆる画面のだまし方を防ぐものではありません。重要な操作では、内容の確認や再認証等も検討します。この教材で防げたと説明する範囲は、主図のiframeを使う例です。[S03]
参考資料
- IPAIPA — 安全なウェブサイトの作り方 1.9 クリックジャッキング
S01概要・脅威、9-(i)-a|応答ヘッダーとDENY/SAMEORIGIN。ALLOW-FROM・IE7・古い統計は採用しない|仕様書確認:2026-10-04
- OWASPOWASP Community — Clickjacking
S02定義・Examples|前面の透明iframeと直接クリック。Flash・攻撃コードは採用しない|仕様書確認:2026-10-04
- OWASPOWASP — Clickjacking Defense Cheat Sheet
S03frame-ancestors、X-Frame-Options、Common Defense Mistakes、SameSite・Limitations|対策と範囲。古い対応表・frame-buster例は採用しない|仕様書確認:2026-10-04
- OWASPOWASP WSTG v4.2 — Testing for Clickjacking
S04WSTG-CLNT-09|Summary|本物UIの操作とCSRFトークン。表示可能だけで被害を断定しない|仕様書確認:2026-10-04
- 参考資料W3C — Content Security Policy Level 3
S05Working Draft(2026-09-16版)|§6.4.2・§6.4.2.1–2、§6.1.5、§3.1–3.3|判定時点・meta不可・XFO・frame-src|仕様書確認:2026-10-04
- 参考資料WHATWG — HTML Living Standard, Origins
S06Living Standard|§7.1.1・§7.1.1.1|DOMの直接読み取り、originとsite。document.domain例は採用しない|仕様書確認:2026-10-04