この記事は学習用です。ChatGPT と GitHub Copilot を使っています。
1. 導入:クリックジャッキングとは何か
クリックジャッキング(Clickjacking)とは、ユーザーが意図しない操作を行うように誘導する攻撃手法です。
攻撃者は透明または偽装された要素を重ねて配置し、ユーザーがクリックした対象を別のページ要素にすり替えます。
たとえば「再生ボタン」をクリックしたつもりが、実際には「送信」や「いいね」を押してしまうケースがあります。
定義
- クリックジャッキングとは、ユーザーのクリック操作を視覚的に欺き、意図しないコンテンツや操作に誘導する UI レイヤー攻撃である。
この攻撃は Web ブラウザーの表示構造(特に iframe
タグ)を悪用するため、サイト側での防御設定が重要になります。
2. 攻撃の仕組みと背景
クリックジャッキングの核心は、オーバーレイ構造(透明な重ね合わせ)
です。
攻撃者は次のような仕組みでユーザーを欺きます。
- 正常なサイトを
iframe
で別サイト内に埋め込む - 透明または部分的に見えるように CSS で調整
- 誘導文やボタンを上に重ねる
- ユーザーがクリック → 実際には隠れた
iframe
上のボタンが押される
背景
- SNS の「いいね」ボタンや認証操作は悪用対象になりやすい。
- クリックジャッキングは CSRF(クロスサイトリクエストフォージェリ)と併用されることも多い。
3. 実際の攻撃例
例1:SNS ボタンの不正クリック
ユーザーが「ゲームを始める」ボタンを押すと、透明化した iframe
越しに SNS の「いいね」ボタンが押される。
→ 攻撃者のページが急速に拡散する。
例2:オンラインバンキングの送金ボタン
被害者がログイン状態のまま攻撃サイトを閲覧すると、透明化した iframe
上の「送金確定」ボタンをクリック。
→ 不正送金が発生。
4. 技術的な防御
クリックジャッキングを防ぐ代表的な HTTP ヘッダーが X-Frame-Options と Content-Security-Policy (CSP) です。
(1) X-Frame-Options
サーバーがページの埋め込みを制御する HTTP レスポンスヘッダーです。
設定値 | 説明 |
---|---|
DENY |
どのサイトからも埋め込み禁止 |
SAMEORIGIN |
同一オリジンからのみ埋め込み許可 |
ALLOW-FROM https://example.com |
特定サイトのみ許可(非標準・主要ブラウザー非対応のため非推奨) |
Apache 設定例
Header always set X-Frame-Options "SAMEORIGIN"
Nginx 設定例
add_header X-Frame-Options "SAMEORIGIN" always;
(2) Content-Security-Policy (CSP)
frame-ancestors
ディレクティブを用いると、より柔軟に制御可能です。
Content-Security-Policy: frame-ancestors 'self' https://trusted-site.com;
→ モダンブラウザーでは CSP による制御が推奨。frame-ancestors
が有効な場合、ブラウザーは X-Frame-Options
よりも frame-ancestors
を優先します。後方互換のために両方を設定する構成が一般的です。
5. 防御実装の確認方法
セキュリティ対策が有効かを確認するには、以下の方法があります。
(1) ブラウザー開発ツール
- Network タブで対象レスポンスのヘッダーを確認
X-Frame-Options
またはContent-Security-Policy
が設定されているかを確認
(2) オンライン診断ツール
- https://securityheaders.com/
→ サイトの HTTP ヘッダー設定を自動解析し、クリックジャッキング防御の有無を評価
6. よくある誤りと注意点
誤り | 問題点 |
---|---|
X-Frame-Options を設定し忘れる | クリックジャッキングに対して脆弱 |
ALLOW-FROM を使用 | 非標準で多くのブラウザーが非対応。期待どおりに動作しない |
一部のページだけ設定 | ログイン・決済ページなどは特に要注意。全ページで一貫して適用 |
SPA の動的レンダリングで未反映 | すべてのルートで適切なレスポンスヘッダーを返す必要がある |
補足:iframe
を必要とする埋め込み機能(例:地図・動画)には、frame-ancestors
に許可オリジンを追加して例外設定を行う。サイトが外部コンテンツを埋め込む場合は、frame-src
(CSP3。CSP2 では child-src
)の適切な設定も検討する。
7. まとめ
クリックジャッキングは単純な UI 操作の欺きでありながら、被害は深刻化し得ます。
防御の基本は以下の 3 点に集約されます。
iframe
制御ヘッダーの設定(X-Frame-Options と CSP の併用)- 重要操作におけるユーザー確認の導入(例:二重確認ダイアログ)
- Web アプリ全体での統一的なセキュリティ設定
これらを組み合わせることで、クリックジャッキングによる被害リスクを最小化できます。
A. 参考サイト
OWASP: Clickjacking Defense Cheat Sheet
MDN Web Docs: X-Frame-Options
MDN Web Docs: Content-Security-Policy/frame-ancestors
Security Headers Scanner
コメント