なぜ危ないのか
クリックジャッキングは、透明なiframeや絶対配置されたオーバーレイ要素を使い、利用者が意図しないボタンをクリックさせる攻撃手法です。AIが生成したHTMLには埋め込みウィジェット用のiframeが含まれる場合があり、社外公開後に第三者が悪意あるページで同じURLを読み込んで悪用するリスクがあります。
社外レビュー用のURLは認証なしで開ける状態が多く、検索エンジンにインデックスされていなくてもURLさえ知っていれば誰でもアクセスできます。特にデザインカンプや提案書HTMLには会社名・担当者名・料金情報が含まれるため、クリックジャッキングで意図せずフォーム送信させられると情報漏えいに直結します。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
テキストエディタでHTMLを開き、`<iframe`タグを全件検索します。src属性が自社ドメイン以外を指していたり、width/heightが0やopacity:0に設定されている場合は即削除対象です。また`position:fixed`や`z-index`が極端に大きい要素も確認し、画面全体を覆うオーバーレイになっていないかCSSを追います。
フォームの`action`属性が外部URLを向いていないか確認します。AIが雛形として挿入した`action="https://formspree.io/..."` のような外部エンドポイントがそのまま残っているケースが実際に報告されています。送信先が意図したサーバーであることを確認し、社外レビュー用途なら`action`属性ごと削除するか`method="dialog"`に差し替えると安全です。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
X-Frame-Options: DENYヘッダーを返すCDNやサービス経由でHTMLを配信すると、第三者サイトがiframeで読み込もうとしても拒否されます。ギガサイト便のような認証付き共有サービスを使えば、URLを知っていても認証を通過しないと閲覧できないため、クリックジャッキング攻撃のための埋め込み自体が成立しません。
共有URLにはレビュー期限を設定してください。期限切れ後もURLが有効なままだと、クライアントが転送したメールから流出したURLが何ヶ月後も生きている状態になります。レビュー完了後はURLを無効化し、修正版は別URLで共有する運用ルールを事前に合意しておくと差し替えトラブルも防げます。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
AIにHTMLを生成させるプロンプトに「iframeを使わない」「外部フォームエンドポイントを含めない」「インラインで position:fixed の全画面要素を作らない」という制約を明示的に追記します。プロンプトテンプレートをチームのNotionやConfluenceに保存しておけば、誰が使っても同じ制約が適用されます。
公開前チェックをCIまたは簡単なシェルスクリプトで自動化するのが最も確実です。`grep -n '<iframe' output.html` や `grep -in 'position.*fixed' output.html` をコミット前フックやレビュー手順書に組み込めば、目視チェックの見落としをゼロにできます。月に一度チェックリスト自体を見直して、新しい攻撃パターンが増えていないか更新する習慣もつけましょう。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
iframeがひとつもなければクリックジャッキングのリスクはゼロですか?
iframeがなくても、CSSで透明な全画面ボタンを重ねる純CSS型のクリックジャッキングは成立します。position:fixedとopacity:0を組み合わせた要素がないかもあわせて確認してください。
noindexを設定すれば検索エンジンに拾われないので安全ですか?
noindexは検索結果に表示されないだけでURLへのアクセスは防げません。認証やIPアドレス制限と組み合わせて初めて第三者からの閲覧を遮断できます。
クリックジャッキング対策としてContent-Security-PolicyとX-Frame-Optionsはどちらを使うべきですか?
CSPのframe-ancestorsディレクティブが推奨される現行標準です。X-Frame-Optionsは古いブラウザ向けのフォールバックとして併用すると、対応漏れリスクをさらに下げられます。