目次
(確認環境:Python 3.8.5、Windows 10)
クリックジャッキング(Clickjacking)とは
クリックジャッキング(Clickjacking)とは、ユーザーが自分がクリックしているものとは別のものを知らずにクリックさせられるサイバー攻撃の手法です。
攻撃のステップ
| 1.罠のサイトを用意 | 攻撃者が、ユーザーがクリックしたくなるような偽のページを作ります。 |
| 2.標的サイトを隠す | そのページの上に、<iframe>などの技術を使って、本物のサイト(SNS、Amazon、銀行など)を透明にして重ねます。 |
| 3.誤クリックの誘発 | ユーザーがプレゼントを受け取るボタンをクリックしたつもりでも、実際にはその下(または上)にある「アカウント削除」や「購入」ボタンを押してしまっています。 |
起こりうる被害
| SNSでの意図しない操作 | 勝手にいいねを押されたり、フォローを外されたりする。 |
| 設定の変更 | セキュリティ設定を無効化されたり、パスワードを変更されたりする。 |
| 金銭的被害 | ネットショッピングで商品を購入させられたり、送金ボタンを押させられたりする。 |
| カメラ・マイクの許可 | ブラウザの権限設定をクリックさせ、盗撮や盗聴を可能にする。 |
開発者(サイト運営者)側の対策
自分のサイトが罠として利用されないように設定します。
| X-Frame-Optionsヘッダー | 自分のサイトが他人のサイトの<iframe>内で表示されるのを禁止します。 |
| ContentSecurityPolicy(CSP) | frame-ancestors指定を使い、特定のドメイン以外での埋め込みを許可しないようにします |
対策のイメージ(X-Frame-Optionsヘッダーの指定)
PythonのBottleフレームワークでクリックジャッキング対策をしたサンプルイメージです。
from bottle import route,run,HTTPResponse
@route('/')
def test1():
html = '<p>テスト「ショップ」のサイト</p>'
html += '<button type="button" '
html += 'onclick="console.log(\'クリックしました\')">買う</button>'
htr = HTTPResponse(body=html)
htr.set_header('X-Frame-Options', 'DENY')
return htr
run(host="127.0.0.1",port='8765')
9行目は、レスポンスヘッダーにX-Frame-OptionsのDENYを指定しています。
このサイトの画面は、iframeに表示されません。
以下のイメージです。

X-Frame-Optionsは、htmlのmetaタグではなく、レスポンスヘッダーに指定します。
webサーバーでは、apacheやIISで指定します。
| 値 | 説明 |
|---|---|
| X-Frame-Options: DENY | サーバーは、iframeに表示することを拒否します。 |
| X-Frame-Options: SAMEORIGIN | サーバーは、同じオリジンのサイトであればiframeに表示することを許可します。 オリジンとはスキーム(http)、ホスト(example.com)、ポート(80)です。 |
iframeとは
iframe(アイフレーム)とは、Webページの中に、別のWebページを埋め込むための窓のようなものです。
正式名称は Inline Frame(インライン・フレーム)です。

自分のWebサイトのコードの中に1行書くだけで、そのエリアにだけ他人のサイトや外部のコンテンツを表示させることができます。
<iframe src="http://127.0.0.1:8765"></iframe>
iframeタグとsrcに対象のアドレスを指定します。
関連の記事
