首页/安全/漏洞与攻击面速查/CSV 公式注入(导出文件安全)
Web 漏洞原理与防护55 条

CSV 公式注入(导出文件安全)

导出 CSV 时若单元格内容以 =、+、-、@ 开头,可能被表格软件当作公式处理,配合相关能力形成风险;导出前应对这类前缀做转义处理。

漏洞与攻击面速查安全更新于 2026-10-13

CSV 公式注入是什么

导出的 CSV 文件被表格软件打开时,以等号、加号、减号或 at 符号开头的单元格内容可能被当作公式解释并执行,而不是当作普通文本。若单元格内容来自用户输入,攻击者可以借此在导出文件里埋入公式,交给查看者打开即触发。防护方式很直接:导出前对这类前缀做转义处理。

基本信息

触发字符=(等号)、+(加号)、-(减号)、@(at 符号)
受影响的软件Excel、WPS、LibreOffice 等电子表格
处理时机服务端生成导出内容时统一净化
处理方式前置单引号或制表符,使其按文本处理
附带要求文件编码按对接方约定,避免乱码引发误判

典型使用场景

  • 用户列表导出:昵称、备注等用户可控字段
  • 日志与告警导出:含用户提交的查询串与文件名
  • 工单批量导出:标题与描述来自外部提交
  • 报表下载:明细行中包含用户输入的分类名
  • 接口对接:把数据以 CSV 形式交付给第三方系统

处理示例

处理示例
def sanitize_cell(value: str) -> str:
    if value and value[0] in ('=', '+', '-', '@'):
        return "'" + value        # 前置单引号,表格软件按文本处理
    return value

rows = [[sanitize_cell(str(c)) for c in row] for row in data]
# 导出统一走这一层,避免在业务代码里各处手工处理

触发字符与处理

起始字符风险处理方式
=被解析为公式前置单引号或制表符
+可能被解析为公式同上
-可能被解析为公式同上
@部分软件中作为函数引用同上
制表符与换行单元格结构被破坏统一做转义或替换
导出文件建议使用带 BOM 的 UTF-8 或按对接方要求的编码,并统一走净化函数,避免在不同导出路径里重复实现导致遗漏。
只对新增数据做处理是不够的:历史数据中的脏字段在下一次导出时同样会被完整带出,因此净化应放在导出环节,而不是录入环节。

易错点

  • 只对抽样数据做处理:历史数据中的脏字段仍会被完整导出
  • 在录入环节净化而不在导出环节:旧数据与新数据来源不同,遗漏不可避免
  • 只处理等号忽略加号、减号与 at 符号:其他前缀同样可被表格软件解释
  • 导出接口有多条代码路径:只在主流程加处理,分支导出接口仍是敞开的

数据来源与参考

  • OWASP CSV Injection 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌