攻撃対策と検証

生成AIのCSV出力を安全に開く|数式インジェクションを実行させない

生成AIのCSVは、3つの経路を分けてセルの型を検査し、数式の実行を防ぎます。
AIの出力をCSVにして配る、開発や情報システムの担当者の悩みに答えます。
引用処理との違い、5つの手順、うまくいかない例、保存し直す試験が分かります。

古野光太朗古野光太朗·2026.10.01·最終更新 2026.10.03·一次情報 7件
生成AIのCSV出力を安全に開く。引用処理とは別に、セルの型と用途を検査する

生成AIのCSVを表計算ソフトで安全に開くには、どうすればよいですか?

セルの型を検査し、機械連携用と閲覧用の出力を分けます。引用処理だけでは足りません。

問い合わせ一覧や商品表では、セルの文字列が表計算ソフトの命令に変わることがあります。これが数式インジェクションです。

利用者が入力した会社名や備考を、AIがそのまま再掲する場合を考えます。先頭が=、+、-、@などなら、CSV自体は正しくても、開いたソフトが数式として解釈し得ます。

対策の境界は、AIの回答生成だけではありません。分けるのは、次の3つの経路です。

そのうえで、最後の出力段階で、すべてのセルを型検査します。

RFC 4180は、カンマ、改行、二重引用符を含む項目を二重引用符で囲うCSVの一般的な形式を示します[1]。Pythonのcsvモジュールも、区切りや引用符を扱います[2]。しかし、形式どおりに引用しても、セルが数式として実行されない保証にはなりません。

CSV出力は、どんな手順で安全にしますか?

値の由来と型の固定、用途の分離、セル単位の無害化、監視、保存し直す試験の5つです。

CSVの出力境界で確認する対象と、拒否または次の工程へ渡す条件を示した設計例です。
TechWorker作成:本文の手順を図にした設計例です。製品の公式画面や導入効果の実測ではありません。画像を押すと拡大できます。

問い合わせの会社名と備考を出力する設計例では、元の受信値を保存したまま、機械連携用と閲覧用を別に作ります。会社名の先頭が数式開始文字でも、元データを削りません。閲覧用だけ変換し、利用する表計算ソフトで保存し直す試験をします。

  1. 値の由来と型を固定します。CSVを文字列連結で作らず、実績のあるCSV出力機能へ一セルずつ渡します。それとは別に、項目の意味を検査します。注文数は整数として解析し直します。日付は、許可した形式に限定します。AIが作った文字列だけを、危険と見なしません。検索結果、問い合わせフォーム、外部API、過去のCSVから取得した値を、AIが再掲する場合もあります。出力項目ごとに、取得元、期待する型、自由記述を許すか、出力先を記録します。サーバー側で、列名と順序を固定します。存在しない列、重複列、想定外の配列や入れ子は、CSV化の前に拒否します。数値列へ自由記述が入った場合も、失敗として記録します。
  2. 出力用途を2つに分けます。機械が再取込みするデータと、人が閲覧するデータを、同じCSVにしません。機械連携には、項目型を明示できるJSONやAPIを優先します。どうしてもCSVが必要なら、送信先、項目型、文字コード、区切り記号を契約として固定します。表計算ソフトでは開きません。人が開くCSVは「表示用」と明記し、元データとは別に作ります。Google Sheets APIは、値の書込みでRAWを指定すると、入力値を解析せず保存します[3]。APIとCSVは同じ経路ではありません。ただ、文字列として保存する指定と、利用者入力として解釈する指定を分ける設計の参考になります。
  3. 自由記述をセル単位で無害化します。OWASPは、CSVの数式注入で注意する開始文字を挙げています。=、+、-、@のほか、タブ、改行、復帰などです[4]。区切り文字や引用符を混ぜると、悪意ある文字列が次のセルの先頭へ移る可能性もあります。完成したCSV全体を正規表現で置換せず、元の項目をセル単位で検査します。引用処理は、CSV出力機能に任せます。表示用セルが危険な文字で始まる場合は、文字列として扱わせる接頭辞を付ける方法があります。元データは書き換えません。正本には受信値を保持し、表示用CSVには変換後の値を入れます。変換件数と規則の版を記録します。完全な文字一致が必要な利用者へは、サーバー側で文字として描画する表やJSONを渡します。
  4. 拒否と変換を監視します。危険な値を変換した件数、型違反で拒否した件数、利用した変換規則の版、出力先を残します。セルの原文そのものは、ログへ複製しません。個人情報や秘密を、別の場所へ広げるためです。項目名、判定理由、値を照合するためのハッシュ、処理時刻で追跡します。急に変換件数が増えた場合は、攻撃だけでなく、上流の項目変更や列ずれも疑います。
  5. 保存し直すところまで試します。試験値には、各開始文字、先頭の空白やタブ、引用符、カンマ、改行、全角の数式開始文字、長い文字列を含めます。Excel、Google Sheets、LibreOfficeなど、実際に使うソフトで開きます。保存し直して、再び開きます。コピーして別のセルへ貼る操作も試します。合格条件は、次のとおりです。数式が実行されないこと、外部リンクや命令が動かないことです。表示用の値が意図どおり読めること、機械連携用データと混ざらないことも条件です。

うまくいかない例には、どんなものがありますか?

引用符や接頭辞への過信、全体置換、元データの書き換え、保護ビューへの依存が典型です。

実害は、仮説だけではありません。NVDが扱うCVE-2023-37219は、CSVへ書き出す値を適切に無害化せず、数式注入につながった例です。CWE-1236に分類されています[7]。個別製品の欠陥は、自社の脆弱性を直接は証明しません。ただ、利用者由来の値をCSVへ戻す境界が、攻撃面になる事例です。

用途ごとに、出力の形はどう変わりますか?

機械連携用は型を明示できるJSONやAPIを優先し、表示用は元データと分けてセル単位で無害化します。

用途推奨する形セルの扱い
機械が再取込みする項目型を明示できるJSONやAPI。CSVなら送信先、項目型、文字コード、区切り記号を契約で固定表計算ソフトでは開かない。型を検査し、違反は拒否して記録する
人が表計算ソフトで開く「表示用」と明記し、元データとは別のCSVにする自由記述をセル単位で検査し、表示用だけ無害化する。変換件数と規則の版を記録する
完全な文字一致が必要サーバー側で文字として描画する表、またはJSONCSVでは渡さない

よくある質問

CSVを二重引用符で囲えば数式注入を防げますか?

防げません。引用符はCSVの区切りを保つ処理です。セルが数式として解釈される危険は別に検査します。保存後に引用やエスケープが失われる場合もあります。

先頭へアポストロフィを付ければ安全ですか?

すべての表計算ソフトと保存後の再読込みに安全を保証する方法ではありません。対象ソフトで試験し、元データと表示用の変換後データを分けます。

AIに危険な文字を出さないよう指示すれば十分ですか?

十分ではありません。AIが外部入力を再掲する経路もあるため、出力段階で型とセル内容を検査します。列名と列順もサーバー側で固定します。

次の一歩は何から始めればよいですか?

出力を機械連携用と表示用に分け、実際に使うソフトで保存し直す試験を、表示用の経路に行います。

  1. 元データを保存する経路、機械連携用、人が開く出力を分けます。
  2. 出力項目ごとに、取得元と期待する型を記録します。
  3. 実際に使う表計算ソフトで、開く、保存し直す、再び開く試験を行います。

出典と確認範囲

資料確認日:2026年10月1日。本文中の手順例は編集部の提案で、導入効果の実測値ではありません。

  1. IETF, RFC 4180
  2. Python, csv — CSV File Reading and Writing
  3. Google for Developers, Read and write cell values
  4. OWASP, CSV Injection
  5. MITRE, CWE-1236
  6. Microsoft Support, What is Protected View?
  7. NIST NVD, CVE-2023-37219
古野光太朗
古野光太朗 / 株式会社TechWorker 代表取締役 CEO兼CTO

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

生成AIの出力境界を点検する

CSVの用途分離、セル型検査、表示用変換、表計算ソフトでの再検証を確認します。

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