CSVエクスポートで=, +, -, @始まりのセルは弾いた方がいいらしい

  • Security
  • CSV

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

社内向けのエクスポート機能(ユーザー一覧をCSVで落とせるやつ)を作ってて、レビューで指摘されたので調べた。

何が起きるか

CSVってただのテキストなんだけど、Excelとかのスプレッドシートソフトで開くと、セルの先頭が特定の文字だと数式として評価されてしまう。ユーザーが入力した名前欄とかに = から始まる文字列を仕込んでおくと、CSVを開いた側のExcel上で式が実行される。

例えば HYPERLINK 関数を使えば、開いた人が気づかないうちに外部URLへのリンクを踏ませたり、シート内の他のセルの値をそのURLのクエリに乗せて送信させたりできるらしい。DDE経由でコマンド実行まで持っていける、という話も見た(さすがに実機では試してない)。

いわゆる「CSVインジェクション」「Formula Injection」というやつで、OWASPにもページがある。

対象になる文字

今のところ挙げられているのは以下の4つ。

  • =(イコール)
  • +(プラス)
  • -(マイナス)
  • @(アット)

対策としては、ユーザー入力由来の値をCSVに書き出すとき、セルの先頭がこの4文字のどれかだったら弾く、もしくはシングルクォートやタブを前置してテキストとして扱わせる、というのが基本方針。

結論

自分のところでは、該当4文字始まりの値をバリデーションで弾く方向にした。数値のマイナスとかを扱うカラムだと地味に影響あるので、そこだけ別枠で判定を入れてる。

CSVを人間が開く前提の機能がある場合は、割と見落としがちなポイントだと思う。