あなたのサイトは 他人に埋め込まれる?
クリックジャッキングは、あなたの本物のページを別サイトの見えないフレームに隠し、訪問者に気づかれないままボタンをクリックさせます。URL を貼り付けて、他のサイトがフレームに埋め込めるかどうか、そしてそれが訪問者にとってリスクになるかを確認しましょう。
- X-Frame-Options
- CSP frame-ancestors
攻撃者と同じように、この URL を当サイトのページ内のフレームに読み込んでいます。ページが見えていれば、どのサイトでも同じことができます。フレームに "refused to connect"(接続が拒否されました)などのエラーが出ていれば、ブラウザがブロックしています。
この URL は暗号化されていない http を使っており、ブラウザは https ページ内では読み込まないため、いずれにしてもフレームは空のままです。上のヘッダー判定を参考にしてください。
対処方法
frame-ancestors を含む Content-Security-Policy を送信し、古いブラウザ向けに X-Frame-Options も追加します。どちらもサイトの前段にある Web サーバーで設定してください。
nginx
add_header Content-Security-Policy "frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
Apache
Header always set Content-Security-Policy "frame-ancestors 'self'"
Header always set X-Frame-Options "SAMEORIGIN"
Odoo をお使いですか? 'none' ではなく 'self' を使ってください。Web サイトエディターは同じドメインのフレーム内に自社ページを表示するためです。CICDoo はデプロイするすべてのインスタンスで、これらのヘッダーをデフォルトで有効にしています。
攻撃の仕組み
あなたのページ、他人のクリック
見えないフレーム
攻撃者はあなたの本物のページを透明な iframe に読み込み、賞品ボタンや動画プレーヤーなどのおとりの上に重ねます。
本物のクリック
訪問者はすでにあなたのサイトにログインしています。そのクリックはあなたのページに届き、支払いの承認、メールアドレスの変更、アクセス権の付与が行われます。
ヘッダー 1 つで防げます
frame-ancestors または X-Frame-Options は、どのサイトがあなたをフレームに埋め込めるかをブラウザに伝えます。これがないと、ブラウザは誰にでも許可します。
よくある質問
疑問にお答えします
このテストでは何をチェックしますか?
当社のサーバーから URL をリクエストし、2 つのレスポンスヘッダー(X-Frame-Options と Content-Security-Policy の frame-ancestors ディレクティブ)を読み取ります。さらにページ内のフレームに URL を読み込むので、ご自身のブラウザで結果を確認できます。
どのヘッダーを使うべきですか?
frame-ancestors は現在の標準で、存在する場合は常に優先されます。古いブラウザ向けに X-Frame-Options も残しておきましょう。自分のドメインだけを許可するなら 'self'、すべてのフレームをブロックするなら 'none' を使います。
フレームが空白なのはなぜですか?
フレームへの埋め込みをブロックしているサイト、不明な訪問者に空白ページを表示するサイト、またはブラウザが https ページ内での読み込みを拒否する http を使っているサイトがあります。ヘッダーの判定結果はブラウザに左右されません。
フレームに埋め込めるなら、サイトは脆弱ということですか?
必ずしもそうではありません。クリックジャッキングが成立するには、支払いや設定変更のような重要な操作があるページ、ログイン中の訪問者、そして別サイトのフレーム内でもブラウザが送信するセッション Cookie が必要です。現在のブラウザは SameSite=None のない Cookie を送信しないため、埋め込まれたページは通常ログアウト状態で表示されます。それでもヘッダーは追加する価値があります。リスクを確実に断ち、セキュリティ監査でもチェックされるからです。
ALLOW-FROM はまだサポートされていますか?
いいえ。現在のブラウザは X-Frame-Options ALLOW-FROM を無視します。特定のパートナーサイトを許可するには、代わりに frame-ancestors に列挙してください。
URL は保存されますか?
レート制限のためのリクエスト記録のみを保持し、URL や結果は保存しません。