PRACTICAL GUIDE
CSVインジェクションと数式実行への対策
CSVの引用符は構文上の区切りを保つもので、セルを数式として解釈する表計算ソフトの動作までは防ぎません。利用先ごとに出力方式を選び、実際のアプリで確認します。
迷ったら、ここで選ぶ
- 機械連携でCSVを読む → セルの値を勝手に書き換えず、受け手のパーサー仕様を確認
- 表計算ソフトで人が開くCSV → 未信頼値を文字列として扱える出力方式を選び、対象アプリで検証
- 引用符で囲めば安全? → CSV構文の保護と数式実行の防止は別の問題
- どの無害化が正解? → アプリごとに挙動が異なるため、万能な変換を前提にしない
CSVのセル値が数式として扱われることがある
Webフォームやデータベースから出力した値をCSVに含め、そのCSVをExcelやLibreOffice Calcなどの表計算ソフトで開くと、先頭が「=」などの値を数式として解釈する場合があります。攻撃者が入力を制御できると、リンクを開かせたり、アプリの脆弱性や利用者の操作を介して被害につながるおそれがあります。影響は表計算ソフトと設定に依存します。
CSVの引用符処理だけでは防げない
CSVのフィールドを二重引用符で囲み、内部の引用符をエスケープするのは、カンマや改行を含む値を正しいセルとして読み取るための構文処理です。表計算ソフトがそのセルを数式とみなすかどうかは別の解釈段階です。そのため、正しくCSVエスケープしたことだけを根拠に、数式インジェクション対策済みとは言えません。
出力先に合わせて文字列として出力する
まずCSVを機械処理用に渡すのか、人が表計算ソフトで開くのかを分けて考えます。後者では、可能なら文字列型を明示できる表計算形式の生成ライブラリなど、値が数式にならない出力方法を検討します。CSVが必要な場合は、先頭の「=」「+」「-」「@」などを含む値を対象アプリがどう扱うか確認し、そのアプリ向けの対策を選びます。先頭にタブやアポストロフィを付ける方法などは、他のアプリでの互換性やデータ値の変化を伴うことがあり、万能策ではありません。
区切り文字や改行によるセル境界も考慮する
未信頼の値にカンマ、セミコロン、引用符、改行が含まれると、処理の誤りによって意図しないセルが生まれ、そのセルの先頭が数式として扱われる可能性もあります。標準的なCSVライブラリでフィールドを正しく符号化したうえで、数式対策は生成後のセル値と利用アプリの解釈に対して行います。手書きの連結処理や単純な先頭文字チェックだけに依存しないでください。
対象アプリで開き直して検証する
代表的な境界値、先頭空白、制御文字、区切り文字や引用符を含む値を用意し、対象とする表計算ソフトで開く・保存する・再度開くところまで試験します。Microsoft Excelは保存後の再読み込みで引用符やエスケープを除去し、対策済みの値が再び数式として有効になる場合があるとOWASPは注意しています。機械連携用の元データが必要なら、人向けの安全化済み出力とは分けて保持してください。
候補形式
関連する比較
注意点
- CSVの引用符・エスケープ処理は数式実行を防ぐセキュリティ境界ではありません。
- 表計算ソフトごとに数式判定や警告、再保存時の挙動が異なります。
- 未信頼の入力を数式として実行しうるCSVを配布する前に、対象アプリと再読み込みを含めて確認してください。