指南
CSV公式注入与安全导出
CSV引号用于保留字段边界,却不能阻止电子表格将单元格解释为公式。应按目标应用选择导出方式,并在该应用中测试。
应该选择哪种格式?
根据文件在工作流程中的用途选择格式。
- CSV用于系统间处理 → 保留值并遵循接收方解析器的规范
- CSV供用户在电子表格中打开 → 选择能将不可信值作为文本处理的输出方式,并在目标应用中测试
- 加引号就够了吗? → 保护CSV语法与防止公式执行是两个问题
- 哪种净化方式正确? → 不同应用的行为不同,不要假设有通用转换方式
CSV单元格可能被当作公式
CSV包含网页表单或数据库中的值时,Excel、LibreOffice Calc等电子表格可能会把以`=`等字符开头的单元格解释为公式。如果攻击者能控制该输入,公式可能通过应用行为或用户操作造成信息泄露等影响。实际后果取决于软件及其设置。
仅使用CSV引号不能防止公式
用双引号包住字段并转义其中的引号,是语法处理,目的是让逗号和换行仍属于预期字段。电子表格是否把单元格解释为公式则是另一个阶段。因此,即使CSV转义正确,也不能据此认定公式注入已得到防护。
针对目标应用选择文本安全的输出方式
先区分供程序处理的CSV与供用户在电子表格中打开的文件。对于后者,可考虑使用能明确将单元格保存为文本的电子表格生成库或格式。如果必须使用CSV,应在目标应用中测试以`=`、`+`、`-`或`@`等字符开头的值,并选择适用于该应用的措施。添加制表符或撇号可能影响兼容性或改变原始值,并非通用方案。
同时考虑分隔符和单元格边界
如果输出组装不正确,不可信值中的逗号、分号、引号和换行可能产生意外单元格,而新单元格可能以公式标记开头。使用标准CSV库正确编码字段,并针对目标应用单独处理公式解释问题。不要只依赖字符串拼接或检查输入的首字符。
通过打开、保存、再打开来测试
在支持的电子表格中测试有代表性的边界值,包括前导空格、控制字符、分隔符和引号,并覆盖保存后再次打开的流程。OWASP提醒,Excel在保存并重新打开CSV时可能移除引号或转义,使先前处理过的值重新成为有效公式。供程序读取的源数据应与为电子表格查看而转换的输出分开保存。
候选格式
导出前注意事项
- CSV引号和转义不是防止公式执行的安全边界。
- 不同电子表格应用的公式识别、警告和重新保存行为可能不同。
- 分发含不可信输入的CSV前,应在目标应用中测试,包括保存后重新打开。