セキュリティ

XSSを含むHTMLを共有するときのリスクと対策

XSSの脆弱性を持つHTMLを社外に公開してしまうと、受け取った相手のブラウザで任意のスクリプトが実行される危険があります。AIが生成したインタラクティブなHTMLに潜む危険なコードパターンの種類と、発覚した際に取るべき対策の手順を、具体的なコード例を交えて解説します。

なぜ危ないのか

XSSが成功すると攻撃者はページ上でJavaScriptを自由に実行でき、ログイン中のセッションCookieを盗んだり、フォームの入力内容を外部サーバーに送信したりできます。社外レビュー用HTMLがクライアントの社内システムにログインした状態のブラウザで開かれた場合、そのセッション情報が攻撃者に送られる最悪のシナリオも理論上は成立します。

Stored XSS(永続型XSS)はデータベースに悪意あるスクリプトを保存させる攻撃ですが、AIが生成するHTMLで特に問題になるのはReflected XSS(反射型XSS)です。URLパラメーターに`<script>alert(1)</script>`を含めてアクセスするだけで脆弱性の存在を確認できるほどシンプルな攻撃で、標的型フィッシングメールに悪意あるURLを埋め込んで送付するといった実際の攻撃に使われます。

  • 相手がログインなしで開ける状態か確認する
  • PCとスマホで最低1回ずつ表示を確認する
  • 内部情報・個人情報・不要な外部送信が残っていないか見る
  • レビュー期限と修正時の差し替え方を決めておく

ソースで見る場所

AIが生成する動的コンテンツ表示でよく見られるXSSパターンの例:`document.getElementById('output').innerHTML = location.hash.slice(1)` は、URLの#以降をそのままHTMLとして挿入します。このコードはURLが `page.html#<img src=x onerror=alert(1)>` のような形式で送られてきたとき、alertが実行されます。

JavaScript内のテンプレートリテラル(バッククォート)で作るHTML文字列も要注意です。`const html = \`<div>${userInput}</div>\`` というパターンでuserInputがサニタイズされていない場合、そのまま`innerHTML`に渡すとXSSになります。grepで`\$\{` を含む行を抽出し、その変数がどこから取得されているかを追跡してください。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

安全に共有する設定

XSSが含まれる疑いのあるHTMLを発見した場合、まず社外共有URLを即時無効化します。無効化と並行して、問題のあるコードを修正します。innerHTML経由で動的コンテンツを表示しているすべての箇所を特定し、textContentへの置き換えまたはDOMPurifyによるサニタイズを実施してから修正版を再公開します。

修正版の再公開前にContent-Security-Policy: script-src 'self' ヘッダーを設定すると、インラインスクリプトの実行を防げます。ただしAIが生成したHTMLはインラインスクリプトを多用するため、CSPを有効化するとページの機能が壊れる可能性があります。CSP適用後に主要機能が正常動作するかどうかをブラウザのコンソールでエラーを確認しながら検証してください。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

再発防止ルール

AIへのプロンプトに「ユーザー入力またはURLパラメーターをDOMに表示する場合は次の関数でサニタイズしてから使うこと:`function escapeHtml(str) { return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#039;'); }` を必ずコードに含めること」と明記します。サニタイズ関数を明示することでAIが関数を生成し忘れるケースを防げます。

公開前のXSSチェックとして「URLに `?test=<script>alert(document.domain)</script>` を付けて開いてアラートが表示されないか確認する」という手順をチェックリストに加えます。XSSが存在するとアラートが表示されるため、目視で即座に判断できます。この確認は2分以内に完了でき、技術的な知識がなくても実施できます。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

よくある質問

完全に静的なHTMLでJavaScriptを一切使っていない場合もXSSはありえますか?

JavaScriptがゼロなら通常のXSSは成立しません。ただしHTMLの属性値にURLを入れる箇所(a hrefやimg srcなど)で`javascript:`スキームが使用可能な場合は別途確認が必要です。

XSSと同時にCSRFも対策すべきですか?

CSRFはサーバー側のエンドポイントへの対策なので、静的HTMLのみの場合は直接の関係はありません。フォームの送信先にサーバーAPIがある場合はCSRFトークンの実装も必要です。

AIにセキュアなコードを書かせるために最も効果的な指示は何ですか?

「OWASPのXSS防止チートシートに従うこと」と「ユーザー入力を扱う箇所はすべてサニタイズ処理のコメントを付けること」を組み合わせると、具体的な制約と可視性が同時に確保でき効果的です。

関連記事

セキュリティ

http混在を含むHTMLを共有するときのリスクと対策

http混在を含むHTMLを共有した場合のリスクを把握し、適切な対処法を選びたい方向け。ブラウザによる表示ブロックや通信傍受のリスクを具体的に示しながら、修正・代替策・共有設定の3つの観点から対策を解説します。

5分で読める
セキュリティ

オープンリダイレクトを含むHTMLを共有するときのリスクと対策

オープンリダイレクトを含むHTMLを外部共有するリスクを理解し、修正判断と対策を迷わず行いたいチームリーダー・開発者向け。フィッシング被害の具体的なシナリオと、許可リスト実装・URL認証による二段階対策を解説する。

6分で読める
セキュリティ

AI生成HTMLにXSSが残っていないか確認する方法

AIが生成したHTMLにXSSの脆弱性が残っていないか確認したい開発者・担当者向け。innerHTMLやevalなどの危険なパターンを検索するコマンド、ブラウザでの挙動確認、自動化の方法まで、公開前に完結できるXSSチェック手順をまとめます。

5分で読める
セキュリティ

社外レビュー前にXSSを検出するチェックリスト

社外レビューを依頼する前にAI生成HTMLのXSSリスクを洗い出したい開発者・デザイナー向け。inline scriptやevalの有無、外部送信先の特定方法など、公開前に一度だけ通るべき手順を解説する。

6分で読める
セキュリティ

XSSを防ぐAIプロンプトと公開前スキャン

AI生成HTMLのXSSリスクをプロンプト設計とスキャンツールの両面から抑えたい開発者向け。指示文の書き方の具体例と、VSCodeやgrepを使ったスキャン手順を説明し、リリース判断の基準を示す。

6分で読める
「セキュリティ」の記事をもっと見る →