使用 fputcsv() 函数并显式指定转义字符为反斜杠 ,可以有效防止 excel 公式注入。默认情况下 php 的 csv 导出功能可能无法完全阻止以等号 =、加号 +、减号 - 或制表符 开头的恶意字符串被 excel 解析为公式。通过设置 escape 参数为 \,php 会在包含特殊字符的字段前添加转义符,从而破坏公式语法。

为什么默认 fgetcsv 行为存在风险?
当 fputcsv() 未指定转义字符时,它默认使用空字符串作为转义符。这意味着如果数据中包含逗号、双引号或换行符,PHP 会对其进行引用处理,但不会处理以 = 开头的字符串。例如,输入 =SUM(A1:A10) 会被原样写入 CSV。当用户在 Excel 中打开该文件时,Excel 会将其识别为公式并执行,导致潜在的安全风险或数据泄露。

$data = [
'Safe Value',
'=SUM(A1:A10)',
'+1+1',
'-1-1',
' =1+1'
];
$file = fopen('vulnerable.csv', 'w');
foreach ($data as $row) {
// 默认行为:escape 为空字符串
fputcsv($file, [$row]);
}
fclose($file);
上述代码生成的 vulnerable.csv 文件中,第二至五行将直接包含可执行的 Excel 公式。用户打开文件后,Excel 会自动计算这些公式,可能导致意外结果或安全漏洞。
如何通过配置 fputcsv 修复注入问题?
修复方法是在调用 fputcsv() 时,将第四个参数 escape 设置为反斜杠 。这样,PHP 会在敏感字符前添加转义符,使 Excel 将其视为普通文本而非公式。例如,=SUM(A1:A10) 将被写为 =SUM(A1:A10),Excel 会忽略其公式属性。

$data = [
'Safe Value',
'=SUM(A1:A10)',
'+1+1',
'-1-1',
' =1+1'
];
$file = fopen('safe.csv', 'w');
foreach ($data as $row) {
// 修复方案:设置 escape 为 \
fputcsv($file, [$row], ',', '"', '\');
}
fclose($file);
此方法确保所有以 =、+、- 或 开头的数据都被正确转义,从而防止 Excel 公式注入。同时,建议结合数据验证逻辑,对输入数据进行清洗,进一步降低风险。
如何处理已存在的 CSV 文件中的公式注入?
对于已生成的 CSV 文件,可以通过读取文件内容并重新写入的方式进行修复。使用 fgetcsv() 读取每一行,然后使用修复后的 fputcsv() 重新写入新文件。这样可以确保所有数据都经过正确的转义处理。
$inputFile = fopen('vulnerable.csv', 'r');
$outputFile = fopen('fixed.csv', 'w');
while (($row = fgetcsv($inputFile)) !== false) {
fputcsv($outputFile, $row, ',', '"', '\');
}
fclose($inputFile);
fclose($outputFile);
此方法适用于批量修复已生成的 CSV 文件,确保所有数据在重新写入时都符合安全标准。同时,建议在处理过程中记录日志,以便追踪修复过程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











