クリックジャッキングとは
クリックジャッキングとは、外見上は無害に見えるウェブページをクリックしている間にウェブ利用者をだまして秘密情報を露呈させる、あるいはウェブ利用者のコンピュータの支配を獲得する悪意の技術である
要はiframe等を使用してユーザーの意図したものとは異なるものをクリックさせる攻撃手法のこと。具体的な実装例は以下のサイトなどが参考になります。
http://hamachiya.com/junk/cj.html
「秘宝館A」ボタンの上には透明化されたFacebookの「いいね!」ボタンが配置されていて、「秘宝館A」を押すと「いいね!」されてしまう、というような仕組みです。
たとえば、SNSのプライバシー設定が勝手に変更されたりすると、困った事態になるかもしれません。
クリックジャッキングはiframeを利用して行うので、自分が作成しているWebサイトがクリックジャッキング対策を施していない場合、攻撃者によってiframeで表示されてしまうかもしれません。
クリックジャッキングを防ぐには
サイトのiframe内の埋め込みを制御する、「X-FRAME-OPTIONS」ヘッダを、HTTPヘッダに含めます。Microsoftが提案した、HTTPの標準にはないヘッダですが、現在の主要なブラウザであれば対応しています(IE8以降、Firefox 3.6以降、Chrome 4.1以降)。
X-FRAME-OPTIONS: DENYというHTTPヘッダを含むページは、iframe内に表示されません。また、X-FRAME-OPTIONS: SAMEORIGINを指定されたページは、「同一生成元(プロトコル・ホスト名・ポート番号が一致している)」という条件を満たす場合のみ、iframe内に表示可能です。
ちなみに、大手サイトだと、TwitterやAmazonはSAMEORIGIN、FacebookはDENY、楽天はログイン後のページ(ショッピングカート等)のみDENY、といった設定になっています。
具体的な設定方法は以下のとおりです。
1. Webサーバの設定を行う
ApacheやNginxといった、Webサーバのレベルで設定します。サイト全体で指定したい場合はこの方法が確実です。
以下はApache(2.2)の設定例です。
Header always append X-Frame-Options SAMEORIGIN
本ブログの場合、ブログ用のVirturlHostの設定の中で「Header always append X-Frame-Options SAMEORIGIN」を指定しています。
以下のようにiframeを使用することが可能ですが、別ドメインからiframeで表示することはできません。
DENYではなくSAMEORIGINにしているのは、使用中のWordpressプラグインの中にiframeを使用しているものがあり、DENYにすると一部プラグインが動かなくなってしまうからです。
2. (PHPの場合)header関数を使用してヘッダを出力する
プログラムでX-FRAME-OPTIONSヘッダを付け足してもOKです。1つ注意が必要なのは、X-FRAME-OPTIONSヘッダは、「厳しくするように上書きはできても、緩めることはできない」という点です。
header('X-FRAME-OPTIONS: SAMEORIGIN');
http://ryo511.info/x_frame_options_sameorigin.phpでは、X-FRAME-OPTIONS: SAMEORIGINを指定しているサイト内で、X-FRAME-OPTIONS: DENYというヘッダを出力しています。
このページをiframeで表示しても、何も表示されません。
逆に、DENYを指定している場合に、SAMEORIGINで上書きしようとしても、DENYの方が優先されます。
参考文献
『PHP逆引きレシピ 第2版』p.782 を読んだのが、本記事を書くきっかけになりました。
IPAが公開している『クリックジャッキング』に関するレポート(pdf)が、クリックジャッキング関係の日本語文献としては最も充実した内容だと思います。攻撃手法から対策方法、対策を施すべきサイトの特徴から、X-FRAME-ORIGINSでは対応出来ない場合の対策まで載っています。
ちなみに、日本のPHP界では、セキュリティといえば「徳丸本」が定番ですが、本書のクリックジャッキング対策には誤りがあるので注意してください。
header('X-FRAME-OPTIONS', 'SAMEORIGIN'); // 徳丸本p.63のコード。これではヘッダは出力されない
header('X-FRAME-OPTIONS: SAMEORIGIN'); // 正しくはこう