安全分析师注意到我们定制的CRM中存在一个安全漏洞:由PHP软件包phpoffice / phpexcel生成的Excel文档可能包含恶意的宏命令。从数据库中获取的Excel文档数据可以包含以某种方式注入的这些恶意宏。他给出了2条有关如何去除该孔的建议:
问题出在第二条建议上。我在每个文档单元格的开头添加了撇号。撇号应该是不可见的,但是在生成的文档中是可见的。当我打开生成的文档时,将光标聚焦在该单元格上并按“ enter”(进入下一个单元格),撇号变得不可见。我不知道如何解决这个问题,您能帮我吗?生成Excel文档的主要代码如下。
也许您知道替代解决方案如何防止phpExcel生成的Excel文档中执行恶意宏?
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');