如何在生成Excel文档时防止恶意Excel宏?(使用phpExcel)
安全分析师注意到我们定制的CRM中存在一个安全漏洞:由PHP包phpoffice/phpexcel生成的Excel文档可能包含恶意宏命令。Excel文档的数据取自数据库,可能包含以某种方式注入的这些恶意宏。他给出了2条如何移除该孔的建议:如何在生成Excel文档时防止恶意Excel宏?(使用phpExcel),php,excel,phpexcel,Php,Excel,Phpexcel,安全分析师注意到我们定制的CRM中存在一个安全漏洞:由PHP包phpoffice/phpexcel生成的Excel文档可能包含恶意宏命令。Excel文档的数据取自数据库,可能包含以某种方式注入的这些恶意宏。他给出了2条如何移除该孔的建议: 如果“=”、“@”、“+”、“-”符号位于文档单元格的开头,请删除这些符号(已实现且无问题) 在每个文档单元格的开头添加撇号(')(该撇号表示“VB语言中注释的开头”,等等…) 问题在于第二条建议。我在每个文档单元格的开头添加了“'”撇号。撇号应该是不可见的,
Excel::create($filename, function($excel) use ($tableFields, $results) {
$excel->sheet('Sheet1', function($sheet) use ($tableFields, $results) {
foreach ($results as $result) {
$line = (array)$result;
foreach ($line as $key=>$val) {
// if cell contains only datetime, format it to Y-m-d H:i:s
if (preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{3})/", $val)==1 || preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{7})/", $val)==1) {
$line[$key] = "'".Carbon::parse($val)->format('Y-m-d H:i:s');
}
elseif (strpos($val, '=')===0 || strpos($val, '@')===0 || strpos($val, '-')===0) {
$line[$key] = "'".substr($val,1);
}
else {
$line[$key] = "'".$val;
}
}
$sheet->appendRow($line);
}
});
})->download('xls');
你的“安全分析师”没有告诉你,你正在使用一个已经三年没有被开发人员接触过的库吗?你应该更新你的代码以使用PHPSReadSheet。不,他没有告诉你。他没有分析代码,只是搜索易受攻击的请求。我知道这个软件包是“废弃”的,作曲家经常向我展示这方面的信息。也许是时候使用更新的软件包了。我们将在几天后做出决定。