最終更新
リンドくん
先生、「クリックジャッキング」って何ですか?最近セキュリティの勉強をしていて出てきたんですけど...
たなべ
クリックジャッキングは見えない罠をクリックさせる攻撃なんだ。
例えば、「無料でプレゼントをもらう」ボタンだと思ってクリックしたら、実は裏に隠された「お金を送金する」ボタンをクリックさせられていた...みたいなことが起こるんだよ。
リンドくん
えっ、怖いですね!どうやってそんなことができるんですか?
たなべ
それは透明なiframeを使ったトリックなんだ。今日はその仕組みと、フレームバスターという防御方法について詳しく説明していくよ。
Webアプリケーションのセキュリティを学ぶ上で、クリックジャッキング(Clickjacking)は必ず理解しておくべき攻撃手法の一つです。
クリックジャッキングは、別名「UI Redressing攻撃」とも呼ばれ、ユーザーを騙して意図しないクリックをさせる攻撃のことを指します。
透明なiframeを使って正規のWebサイトを重ね、ユーザーが別のボタンをクリックしていると思わせながら、攻撃者が意図した操作を実行させてしまうのです。
この記事では、クリックジャッキング攻撃の仕組みから、X-Frame-OptionsやCSP(Content Security Policy)、そしてフレームバスターといった防御方法まで、セキュリティ学習を始めたばかりの方でも理解できるよう、実例を交えながら解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
透明なiframeって、どういうことなんですか?
たなべ
iframeっていうのは、Webページの中に別のWebページを埋め込む技術なんだ。
これ自体は便利な機能なんだけど、CSSで透明にして正規サイトの上に重ねることで、ユーザーには見えない罠を作れちゃうんだよ。
クリックジャッキング攻撃は、以下のような手順で実行されます。
実際にどのようなコードで攻撃が行われるのか見てみましょう。
このコードでは、ユーザーは「プレゼントを受け取る」ボタンをクリックしているつもりが、実際には透明なiframe内の銀行サイトの「送金」ボタンをクリックさせられてしまいます。
攻撃者はさらに巧妙な手法を使うこともあります。
ダブルクリックを要求する手法
マウスカーソル位置のずらし
実際にどのような被害が発生する可能性があるのでしょうか。
クリックジャッキングは、ユーザーの操作そのものを乗っ取るため、非常に危険な攻撃手法なのです。
リンドくん
じゃあ、どうやって防げばいいんですか?
たなべ
最も基本的で効果的な方法がX-Frame-OptionsというHTTPヘッダを設定することなんだ。
これを使えば、自分のサイトがiframeに埋め込まれること自体を防げるんだよ。
X-Frame-Optionsは、ブラウザに対してiframeでの表示を制御する指示を出すHTTPレスポンスヘッダです。このヘッダを設定することで、自分のWebサイトが他のサイトのiframe内に表示されるのを防ぐことができます。
X-Frame-Optionsには以下の3つの設定値があります。
DENY(完全拒否)どのサイトからもiframeでの埋め込みを拒否します。最も厳格な設定です。
SAMEORIGIN(同一オリジンのみ許可)自分のサイトと同じドメインからのみiframe埋め込みを許可します。サブページを自サイト内でiframe表示したい場合などに使用します。
ALLOW-FROM(特定のオリジンのみ許可)指定した特定のサイトからのみiframe埋め込みを許可します。
※ただし、この値は現在多くのブラウザでサポートが終了しているため、後述のCSPの使用が推奨されます。
実際に各種サーバでX-Frame-Optionsを設定する方法を見ていきましょう。
X-Frame-Optionsが正しく設定されているか確認する方法はいくつかあります。
ブラウザの開発者ツールで確認
curlコマンドで確認
オンラインツールで確認
これらのツールでサイトのURLを入力すると、セキュリティヘッダの設定状況を確認できます。
X-Frame-Optionsは効果的ですが、いくつかの制限があります。
これらの制限を克服するため、次世代の対策としてCSP(Content Security Policy)が推奨されています。
リンドくん
X-Frame-Options以外にも方法があるんですか?
たなべ
そう!CSP(Content Security Policy)という、より柔軟で強力な仕組みがあるんだ。
X-Frame-Optionsの後継として、こちらが推奨されているよ。
CSPは様々なセキュリティ設定ができる包括的な仕組みですが、クリックジャッキング対策にはframe-ancestorsディレクティブを使用します。
基本的な書き方
どのサイトからもiframe埋め込みを拒否します。X-Frame-Options: DENYと同等です。
'self'(同一オリジンのみ)自分のサイトからのみiframe埋め込みを許可します。X-Frame-Options: SAMEORIGINと同等です。
特定のドメインを指定複数の信頼できるドメインを指定できます。これがX-Frame-Optionsに対する大きなアドバンテージです。
Apache
Nginx
PHP
最大限の互換性を確保するため、両方を併用することが推奨されます。
より包括的なセキュリティを実現するCSPの例です。
CSPは強力ですが、設定ミスでサイトが壊れる可能性もあります。安全にテストする方法があります。
Report-Onlyモードでテスト
このモードでは、CSPに違反しても実際にはブロックされず、違反内容が指定したURLに送信されます。本番適用前のテストに最適です。
リンドくん
サーバ側の設定ができない場合はどうすればいいんですか?
たなべ
そういう場合はフレームバスターというJavaScriptを使った方法があるよ。
ただし、これは補助的な対策として考えるべきで、HTTPヘッダによる防御の方が確実なんだ。
フレームバスターは、JavaScriptを使ってiframeに埋め込まれていないかをチェックし、埋め込まれている場合は対処するコードのことです。
最もシンプルなフレームバスターは以下のようなものです。
このコードは、自分のページがiframe内で表示されている場合、親ページを自分のページで置き換えます。
上記のシンプルなコードは、攻撃者によって回避される可能性があります。より堅牢な実装を見てみましょう。
攻撃者は以下のような方法でフレームバスターを無効化しようとします。
これを防ぐため、JavaScriptが実行されるまでページを非表示にする方法があります。
フレームバスターにはいくつかの問題があります。
JavaScriptが無効な環境では動作しない
sandbox属性による無効化
204 No Contentレスポンスによる無効化 攻撃者が204レスポンスを返すことで、location変更を無効化できます。
onBeforeUnloadイベントの悪用
フレームバスターは以下のように使用すべきです。
理想的なセキュリティ実装は以下のような多層防御です。
この多層防御により、一つの対策が破られても他の対策でカバーできる体制を構築できます。
定期的にセキュリティ設定をチェックしましょう。
推奨ツール
これらのツールを使って定期的にサイトをスキャンすることで、設定漏れや新たな脆弱性を発見できます。
リンドくん
クリックジャッキングの仕組みと防御方法、よくわかりました!
たなべ
素晴らしいね!最後に重要なポイントをまとめておこう。
セキュリティ対策は一つの方法だけに頼らず、複数の対策を組み合わせることが大切なんだ。これを多層防御(Defense in Depth)と呼ぶんだよ。
この記事では、クリックジャッキング攻撃の仕組みと、様々な防御方法について詳しく解説してきました。
重要なポイントを改めて整理しましょう。
クリックジャッキング対策は、プロジェクトの初期段階から組み込むべきセキュリティ対策の一つです。
後から追加するよりも、最初から適切な設定をしておく方が、はるかに効率的で安全です。
今回学んだ知識を、ぜひあなたのプロジェクトに活かしてください。HTTPヘッダの設定は非常にシンプルですが、その効果は絶大です。たった1行のコード追加で、深刻な攻撃からユーザーを守ることができるのです。
セキュリティは、ユーザーの信頼を獲得し、長期的にサービスを運営していく上で欠かせない要素です。
クリックジャッキング対策だけでなく、CSRF対策、XSS対策、SQL インジェクション対策など、包括的なセキュリティ知識を身につけていきましょう。