攻撃対策と検証

生成AIのMarkdown表示でXSSリスクを減らす|無害化・URL・Trusted Typesの実装境界

生成AIのMarkdownは、信頼できない入力として表示します。生のHTML、URL、画像、コードブロックを同じ処理へ流さず、解析と無害化の境界を固定します。

古野光太朗古野光太朗·2026.09.28·最終更新 2026.10.06

主な対象読者情シス・AI導入担当

生成AIの返答をウェブ画面に表示するとき、文章に混ざったHTMLやリンクが問題になることがあります。モデルの出力も外部から受け取るデータとして扱い、表示先に合った処理を通す必要があります。OWASPの指針を基に、Markdownを表示するまでの境界を確認します。

一次資料:OWASPの安全な出力処理の指針(確認:2026年10月6日)

Each variable used in the user interface should be passed through an output encoding function.

出典:OWASP Cross Site Scripting Prevention Cheat Sheet。引用は、画面へ入れる値に出力先に応じたエンコード処理を求めています。Markdownの解析だけで、安全な表示が保証されるわけではありません。

生成文を解析、無害化し、安全な表示先へ渡す設計例
TechWorker作成:生成文からHTML、URL、CSVを分け、表示前に検査する境界を図示しています。 製品の公式画面や導入効果の実測ではありません。画像を押すと拡大できます。

OWASPは出力先ごとに処理を分ける

同じ文字列でも、HTML本文、属性、URL、JavaScriptへ入れると必要な処理が変わります。Markdownの描画処理がHTMLを生成する場合、生成AIの返答は外部入力と同じ扱いです。

「モデルが作った文章だから安全」という前提は置けません。攻撃者が入力文や参照文書へ埋めた文字列が、そのまま返る可能性があります。

解析してから無害化処理し、安全な出力先へ渡す

生のHTMLは既定で無効にします。MarkdownをDOMへ変換した後、許可する要素と属性だけを無害化処理へ通します。その結果をinnerHTMLへ直接渡す箇所は1か所に集約します。

無害化処理後のHTMLを文字列置換すると、無害化した構造を壊すことがあります。リンク装飾やコードの色分けは、無害化処理前後の責任範囲を決めて実装します。

URLと画像は通信方式・ホストを絞る

javascript:や予期しないdata:を拒否し、通常はhttps:だけを許可します。画像の外部URLは閲覧者のIPや参照元を外部へ送るため、中継または許可ホストを使います。

リンクを開く前には、表示文字列と実際のリンク先が異ならないかを確認します。短縮URLや転送先も同じ検査へ戻します。

CSVは先頭文字を表計算ソフトへ渡さない

生成AIが作るCSVも外部入力です。数式インジェクションでは、セル先頭の=、+、-、@に加え、タブ、復帰、改行、=、+、-、@などの全角文字も検査します。区切り文字や引用符を使って途中から新しいセルを始められるため、CSVとして分割・引用符処理した後の全セルを調べます。

二重引用符で囲み、先頭へ単一引用符を加える方法も、Excelで保存して開き直すと効かない場合があります。すべての表計算ソフトと後続処理に共通する万能な処理はないため、対象の表計算ソフト、保存後の再読込み、業務システムへの取込みまで試験します。Excel向けのタブ接頭辞はデータにタブが残り、後続取込みへ影響するため、人が閲覧する用途に限定します。

Trusted TypesはDOMへの最後の入口を閉じる

Trusted Typesは、危険なDOMの出力先へ任意文字列を渡す実装をブラウザ側で止めます。無害化処理を置き忘れた新機能を検知する補助線になります。

ただし、許可規則が雑なら効果はありません。CSPの報告と試験で、未許可の出力先が残っていないことを確認します。

出典と確認範囲

古野光太朗
古野光太朗 / 株式会社TechWorker 代表取締役 CEO兼CTO

上場企業を含む45社・2,500名の生成AI導入・研修支援で得た実務知をもとに、導入・運用・顧客理解を扱っています。この実績はTechWorkerの生成AI支援実績であり、個別製品の導入実績を示すものではありません。

生成AI画面の出力処理をレビューする

Markdown解析器、無害化処理、URL、CSP、Trusted Types、回帰試験の境界を確認します。

実務への導入を相談する
← AIセキュリティ・ラボの記事一覧に戻る