ひとことで言うと
XSS(クロスサイトスクリプティング)とは、攻撃者が悪意あるJavaScriptコードをWebページに埋め込み、そのページを開いた別の人のブラウザで勝手に実行させる攻撃手法です。たとえばフォームの入力値をそのままHTMLに出力するページがあると、攻撃者はスクリプトタグを含む文字列を送り込み、閲覧者のCookieを盗んだり、偽のログイン画面を表示したりできます。
AI生成の静的HTMLを共有する場合、コード内に外部入力を受け取るフォームや動的なDOM操作が含まれているときにXSSが成立しやすくなります。AIが生成したコードはinnerHTMLへの直接代入や eval() 呼び出しを含むことがあるため、共有前に必ずコードレビューか自動スキャンを行うことが推奨されます。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
HTML共有で関係する場面
社内レビュー用にAI生成のプロトタイプページを共有URLとして配布したとき、そのURLを第三者が改ざんしたパラメータ付きで送り返すケースがあります。URLのクエリ文字列をJavaScriptでDOM反映している実装があれば、受け取り側のブラウザでスクリプトが実行されてしまいます。これを「反射型XSS」と呼び、共有リンクを踏んだ人だけが被害を受けます。
ギガサイト便のような静的ホスティング型の共有サービスを使う場合、サーバー側に動的処理がないためXSSリスクは限定的です。ただしHTMLファイル内にユーザー入力を受け取るフォーム+JavaScript処理が含まれている場合は、ファイル単体でXSSが成立します。共有前に「JavaScriptがユーザー入力をHTMLへ直接書き込んでいないか」を確認する習慣が重要です。
よくある誤解
「パスワード保護URLを使っているからXSSは関係ない」という誤解があります。パスワード認証はアクセスを制限するだけで、認証を通過した閲覧者のブラウザ内でスクリプトが実行されるのは防げません。認証済みユーザーのセッションやCookieが盗まれるリスクはむしろ深刻で、内部関係者限定共有でも油断は禁物です。
「HTMLファイルを自分で作っていないからXSSは入らない」という思い込みも危険です。AIが生成したコードは学習データに含まれる脆弱なコードパターンを再現する場合があります。特にinnerHTML・document.write・eval の3つが含まれていれば黄色信号として扱い、その周辺ロジックを重点的に確認してください。
安全に使うための注意点
AI生成HTMLをブラウザで開く前に、テキストエディタでコード全体を検索し「innerHTML」「document.write」「eval」「javascript:」の文字列が含まれていないか確認します。これらが見つかったら、どこから値を受け取っているかを追跡し、ユーザー入力由来の文字列を直接HTMLに挿入していないかチェックしてください。
共有サービス側でContent Security Policy(CSP)ヘッダーが設定されていると、インラインスクリプトの実行をブラウザレベルで制限できるため、XSSの被害を大幅に抑えられます。ギガサイト便のようにCloudflare Workersを介して配信するサービスはCSPヘッダーを付与できるので、共有先が業務用途なら設定の有無を確認しておくと安心です。
社内外へのHTML共有前にチェックすべき最低限の手順として、①外部スクリプト読み込み元の確認(httpsか、信頼できるCDNか)、②URLパラメータをDOM反映する処理の有無、③共有期限を設定して不要になったURLを無効化、の3点を行うだけでもリスクを大きく下げられます。
よくある質問
静的なHTMLファイルでもXSSは起こりますか?
はい。JavaScriptがURLのクエリ文字列やハッシュ値をinnerHTMLに書き込む実装があれば、完全な静的ファイルでも反射型XSSが成立します。ファイルに動的なDOM操作が含まれるか必ず確認してください。
AIが生成したHTMLのXSSリスクを手軽にチェックする方法はありますか?
VS CodeなどのエディタでinnerHTML・eval・document.writeをキーワード検索するだけでも有効です。より厳密にはDOMPurifyのような無害化ライブラリの利用やESLintのセキュリティプラグインによる自動検査を組み合わせると確実性が上がります。
XSSとSQLインジェクションはどう違うのですか?
SQLインジェクションはデータベースへの不正操作を狙うサーバー側の脆弱性です。XSSはブラウザ上でスクリプトを実行させるクライアント側の攻撃で、静的HTMLサイトでも発生しうる点が大きな違いです。