

CSVエクスポートで=, +, -, @始まりのセルは弾いた方がいいらしい
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
社内向けのエクスポート機能(ユーザー一覧をCSVで落とせるやつ)を作ってて、レビューで指摘されたので調べた。
何が起きるか
CSVってただのテキストなんだけど、Excelとかのスプレッドシートソフトで開くと、セルの先頭が特定の文字だと数式として評価されてしまう。ユーザーが入力した名前欄とかに = から始まる文字列を仕込んでおくと、CSVを開いた側のExcel上で式が実行される。
例えば HYPERLINK 関数を使えば、開いた人が気づかないうちに外部URLへのリンクを踏ませたり、シート内の他のセルの値をそのURLのクエリに乗せて送信させたりできるらしい。DDE経由でコマンド実行まで持っていける、という話も見た(さすがに実機では試してない)。
いわゆる「CSVインジェクション」「Formula Injection」というやつで、OWASPにもページがある。
対象になる文字
今のところ挙げられているのは以下の4つ。
=(イコール)+(プラス)-(マイナス)@(アット)
対策としては、ユーザー入力由来の値をCSVに書き出すとき、セルの先頭がこの4文字のどれかだったら弾く、もしくはシングルクォートやタブを前置してテキストとして扱わせる、というのが基本方針。
結論
自分のところでは、該当4文字始まりの値をバリデーションで弾く方向にした。数値のマイナスとかを扱うカラムだと地味に影響あるので、そこだけ別枠で判定を入れてる。
CSVを人間が開く前提の機能がある場合は、割と見落としがちなポイントだと思う。