CSV:简单格式下隐藏的那些坑
![CSV:简单格式下隐藏的那些坑](https://static001.geekbang.org/infoq/35/35811559af3bb3c2e9c03ba2472e9257.jpeg)
本文分享自华为云社区《CSV—简单格式下隐藏的那些坑》,作者:aKi。
前言
CSV(Comma-Separated Values),是一种通用的、相对简单的文件格式。其文件以纯文本形式存储表格数据,文件可由任意数目的记录组成,记录间以换行符分隔,每条记录由字段组成,字段间的分隔符是特定字符或字符串,最常见的是以逗号作为分隔符。
例如:下面是一个含有三行内容的 csv 文件。
![](https://static001.geekbang.org/infoq/14/146234b468759612e015ed05ff6513bd.png)
CSV 格式广泛应用于程序之间转移表格数据,这些程序在格式上是不兼容的,在没有高效的数据迁移工具时,CSV 就成为最好的中间格式之一,因此大部分程序也都支持 CSV 数据的导入和导出。例如,从 A 程序导出 CSV 文件,再将该文件导入至 B 程序。这一过程看似简单,但其中也存在着不少隐含的坑,下面我们就来盘点一下常见的三种坑。
坑一:换行和逗号
前文中我们提到过 CSV 文件中每条记录是通过换行符分隔的,常用逗号作为分隔符。但在实际处理数据时会遇到字段中也存在换行和逗号的情况,如果 A 程序没有处理好对应的数据,在导入 B 程序时就会产生错误的数据或记录。
例如:下面 CSV 文件中第二行的记录中第四个字段中包含逗号和换行。
![](https://static001.geekbang.org/infoq/c8/c8a49a8b306f43490c8d42ef6dcb78af.png)
我们可以使用 Excel 工具来查看该文件文解析后的样子:
![](https://static001.geekbang.org/infoq/0e/0e09652e2fa32115cdfbc4b4e97d95dc.png)
正确的数据处理方式是将包含逗号和换行的字段用双引号包围起来:
![](https://static001.geekbang.org/infoq/ec/ec5a651e9260d448635910db71b7ea8a.png)
对应文件被解析后:
![](https://static001.geekbang.org/infoq/fc/fc892439ed12d65ad343033cfb09c76f.png)
拓展一下,字段中的若本身就存在双引号,需要在字段自身的双引号前再加一个双引号。
比如我们在 Airplane 前加一个双引号表示字段本身的数据:
![](https://static001.geekbang.org/infoq/2e/2e2ed1e8032fc6b6717dbf41921560f8.png)
该文件使用本文工具打开以后是这样的:
![](https://static001.geekbang.org/infoq/3b/3bcc3cf984da9903ce176ebd6d6f7c91.png)
坑二:BOM 头
很多时候 CSV 文件的编码格式都是较为常见 UTF-8 格式,UTF-8 格式存在 BOM 头的问题,这种问题大部分原因是在 Windows 下编辑 CSV 文件时被自动加上了 BOM 头。如果程序 B 没有处理好 BOM 头,会导致将 BOM 头也被当做字段的一部分,而且这种错误无法通过直接观察 CSV 文件来发现。
例如这里是两个内容完全相同的文件:
![](https://static001.geekbang.org/infoq/bd/bd90b102807c9c0c6889aec3b936bbdf.png)
当一个包含 BOM 头,另一个不包含时,其二进制表达是不一样的:
![](https://static001.geekbang.org/infoq/66/6602675d7007f82f2739099d17815db3.png)
包含 BOM 头的文件在文件开始位置多了 3 个字节数据。处理方式也很简单,将文件以无 BOM 的形式保存就行。
坑三:CSV 注入
CSV 注入其实是一个安全漏洞,当 CSV 文件被 Excel 工具打开时,其字段数据被 Excel 解析,从而支持了 Excel 提供的所有动态功能。
下面我们来看一个例子:
![](https://static001.geekbang.org/infoq/6f/6fe77035224c42df5fe60fb169dd4962.png)
我们将其中一个字段写成了=1+1,此时用 Excel 工具打开该文件:
![](https://static001.geekbang.org/infoq/b4/b4a0ef91da285bc60b399bc8395d4047.png)
=1+1 被解析成了 2
同理,利用此漏洞还可以执行任意程序。
![](https://static001.geekbang.org/infoq/97/9714983bd14a8de71b9c03864e2611e6.png)
用 Execl 打开时会出现如下提示:
![](https://static001.geekbang.org/infoq/3e/3e8e444dcca4ec02b54fc1de9e8d51ba.png)
点击是后便会运行计算器程序
![](https://static001.geekbang.org/infoq/4f/4f44c0fa9df73c16fe5a44deec7504f4.png)
当然,该漏洞在较新版本的 Excel 中都被默认禁止了。在文件->选项->信任中心中外部内容设置中默认都是不勾选“启用动态数据交换服务器启动”。
![](https://static001.geekbang.org/infoq/ed/edb18ea5caba6febc5169c13138bf877.png)
以上就是我在处理 csv 数据时遇到过的坑,希望读者们在遇到类似问题时能第一时间想到原因和解决方案,避免在坑里徘徊太久。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/130ccd9458fe51d4a481cf4a2】。文章转载请联系作者。
评论