生成AIのCSVを表計算ソフトで安全に開くには、どうすればよいですか?
セルの型を検査し、機械連携用と閲覧用の出力を分けます。引用処理だけでは足りません。
問い合わせ一覧や商品表では、セルの文字列が表計算ソフトの命令に変わることがあります。これが数式インジェクションです。
利用者が入力した会社名や備考を、AIがそのまま再掲する場合を考えます。先頭が=、+、-、@などなら、CSV自体は正しくても、開いたソフトが数式として解釈し得ます。
対策の境界は、AIの回答生成だけではありません。分けるのは、次の3つの経路です。
- 元データを保存する経路
- 機械連携用の出力
- 人が表計算ソフトで開く出力
そのうえで、最後の出力段階で、すべてのセルを型検査します。
RFC 4180は、カンマ、改行、二重引用符を含む項目を二重引用符で囲うCSVの一般的な形式を示します[1]。Pythonのcsvモジュールも、区切りや引用符を扱います[2]。しかし、形式どおりに引用しても、セルが数式として実行されない保証にはなりません。
CSV出力は、どんな手順で安全にしますか?
値の由来と型の固定、用途の分離、セル単位の無害化、監視、保存し直す試験の5つです。

問い合わせの会社名と備考を出力する設計例では、元の受信値を保存したまま、機械連携用と閲覧用を別に作ります。会社名の先頭が数式開始文字でも、元データを削りません。閲覧用だけ変換し、利用する表計算ソフトで保存し直す試験をします。
- 値の由来と型を固定します。CSVを文字列連結で作らず、実績のあるCSV出力機能へ一セルずつ渡します。それとは別に、項目の意味を検査します。注文数は整数として解析し直します。日付は、許可した形式に限定します。AIが作った文字列だけを、危険と見なしません。検索結果、問い合わせフォーム、外部API、過去のCSVから取得した値を、AIが再掲する場合もあります。出力項目ごとに、取得元、期待する型、自由記述を許すか、出力先を記録します。サーバー側で、列名と順序を固定します。存在しない列、重複列、想定外の配列や入れ子は、CSV化の前に拒否します。数値列へ自由記述が入った場合も、失敗として記録します。
- 出力用途を2つに分けます。機械が再取込みするデータと、人が閲覧するデータを、同じCSVにしません。機械連携には、項目型を明示できるJSONやAPIを優先します。どうしてもCSVが必要なら、送信先、項目型、文字コード、区切り記号を契約として固定します。表計算ソフトでは開きません。人が開くCSVは「表示用」と明記し、元データとは別に作ります。Google Sheets APIは、値の書込みで
RAWを指定すると、入力値を解析せず保存します[3]。APIとCSVは同じ経路ではありません。ただ、文字列として保存する指定と、利用者入力として解釈する指定を分ける設計の参考になります。 - 自由記述をセル単位で無害化します。OWASPは、CSVの数式注入で注意する開始文字を挙げています。
=、+、-、@のほか、タブ、改行、復帰などです[4]。区切り文字や引用符を混ぜると、悪意ある文字列が次のセルの先頭へ移る可能性もあります。完成したCSV全体を正規表現で置換せず、元の項目をセル単位で検査します。引用処理は、CSV出力機能に任せます。表示用セルが危険な文字で始まる場合は、文字列として扱わせる接頭辞を付ける方法があります。元データは書き換えません。正本には受信値を保持し、表示用CSVには変換後の値を入れます。変換件数と規則の版を記録します。完全な文字一致が必要な利用者へは、サーバー側で文字として描画する表やJSONを渡します。 - 拒否と変換を監視します。危険な値を変換した件数、型違反で拒否した件数、利用した変換規則の版、出力先を残します。セルの原文そのものは、ログへ複製しません。個人情報や秘密を、別の場所へ広げるためです。項目名、判定理由、値を照合するためのハッシュ、処理時刻で追跡します。急に変換件数が増えた場合は、攻撃だけでなく、上流の項目変更や列ずれも疑います。
- 保存し直すところまで試します。試験値には、各開始文字、先頭の空白やタブ、引用符、カンマ、改行、全角の数式開始文字、長い文字列を含めます。Excel、Google Sheets、LibreOfficeなど、実際に使うソフトで開きます。保存し直して、再び開きます。コピーして別のセルへ貼る操作も試します。合格条件は、次のとおりです。数式が実行されないこと、外部リンクや命令が動かないことです。表示用の値が意図どおり読めること、機械連携用データと混ざらないことも条件です。
うまくいかない例には、どんなものがありますか?
引用符や接頭辞への過信、全体置換、元データの書き換え、保護ビューへの依存が典型です。
- 二重引用符で囲えば防げると考えます。引用符は、CSVの区切りを保つ処理です。セルが数式として解釈される危険は、別に検査します。
- 先頭へアポストロフィを付ければ安全と考えます。OWASPは、全ての表計算ソフトで通用する単一の無害化手段がないと注意しています[4]。接頭辞や引用方法が、保存し直した後に失われる場合もあります。MITREのCWE-1236も、数式開始文字の除去や接頭辞付与を対策候補に挙げます[5]。同時に、製品ごとの差と、完全ではない可能性を記しています。
- AIに「危険な文字を出すな」と指示して済ませます。AIが外部入力を再掲する経路があります。出力段階で、型とセル内容を検査します。
- 完成したCSV全体を置換します。元の項目をセル単位で検査します。
- 元データを書き換えます。正本には受信値を保持します。
- 表計算ソフトの警告を安全の根拠にします。Microsoftの保護ビューは、信頼できない場所のCSVなどを、制限された状態で開きます[6]。設定によります。ただ、利用者は保護ビューを終了でき、組織や端末の設定も異なります。
- 同じ画面から無害化前のCSVを渡します。利用者が「元の値が必要」と求めても、渡しません。承認された機械連携経路か、文字として表示する管理画面で確認してもらいます。例外のたびに出力規則を緩めず、正本の確認手段を別に用意します。
- 表計算ソフトで開く必要のない出力までCSVにします。CSV数式注入に、万能な変換はありません。残る表示用経路だけを、試験対象にします。
実害は、仮説だけではありません。NVDが扱うCVE-2023-37219は、CSVへ書き出す値を適切に無害化せず、数式注入につながった例です。CWE-1236に分類されています[7]。個別製品の欠陥は、自社の脆弱性を直接は証明しません。ただ、利用者由来の値をCSVへ戻す境界が、攻撃面になる事例です。
用途ごとに、出力の形はどう変わりますか?
機械連携用は型を明示できるJSONやAPIを優先し、表示用は元データと分けてセル単位で無害化します。
| 用途 | 推奨する形 | セルの扱い |
|---|---|---|
| 機械が再取込みする | 項目型を明示できるJSONやAPI。CSVなら送信先、項目型、文字コード、区切り記号を契約で固定 | 表計算ソフトでは開かない。型を検査し、違反は拒否して記録する |
| 人が表計算ソフトで開く | 「表示用」と明記し、元データとは別のCSVにする | 自由記述をセル単位で検査し、表示用だけ無害化する。変換件数と規則の版を記録する |
| 完全な文字一致が必要 | サーバー側で文字として描画する表、またはJSON | CSVでは渡さない |
よくある質問
防げません。引用符はCSVの区切りを保つ処理です。セルが数式として解釈される危険は別に検査します。保存後に引用やエスケープが失われる場合もあります。
すべての表計算ソフトと保存後の再読込みに安全を保証する方法ではありません。対象ソフトで試験し、元データと表示用の変換後データを分けます。
十分ではありません。AIが外部入力を再掲する経路もあるため、出力段階で型とセル内容を検査します。列名と列順もサーバー側で固定します。
次の一歩は何から始めればよいですか?
出力を機械連携用と表示用に分け、実際に使うソフトで保存し直す試験を、表示用の経路に行います。
- 元データを保存する経路、機械連携用、人が開く出力を分けます。
- 出力項目ごとに、取得元と期待する型を記録します。
- 実際に使う表計算ソフトで、開く、保存し直す、再び開く試験を行います。
出典と確認範囲
資料確認日:2026年10月1日。本文中の手順例は編集部の提案で、導入効果の実測値ではありません。

