如何在生成Excel文档时防止恶意Excel宏?(使用phpExcel)

如何在生成Excel文档时防止恶意Excel宏?(使用phpExcel),php,excel,phpexcel,Php,Excel,Phpexcel,安全分析师注意到我们定制的CRM中存在一个安全漏洞:由PHP包phpoffice/phpexcel生成的Excel文档可能包含恶意宏命令。Excel文档的数据取自数据库,可能包含以某种方式注入的这些恶意宏。他给出了2条如何移除该孔的建议: 如果“=”、“@”、“+”、“-”符号位于文档单元格的开头,请删除这些符号(已实现且无问题) 在每个文档单元格的开头添加撇号(')(该撇号表示“VB语言中注释的开头”,等等…) 问题在于第二条建议。我在每个文档单元格的开头添加了“'”撇号。撇号应该是不可见的,

安全分析师注意到我们定制的CRM中存在一个安全漏洞:由PHP包phpoffice/phpexcel生成的Excel文档可能包含恶意宏命令。Excel文档的数据取自数据库,可能包含以某种方式注入的这些恶意宏。他给出了2条如何移除该孔的建议:

  • 如果“=”、“@”、“+”、“-”符号位于文档单元格的开头,请删除这些符号(已实现且无问题)
  • 在每个文档单元格的开头添加撇号(')(该撇号表示“VB语言中注释的开头”,等等…)
  • 问题在于第二条建议。我在每个文档单元格的开头添加了“'”撇号。撇号应该是不可见的,但它在生成的文档中是可见的。当我打开生成的文档时,将光标聚焦在单元格上并按“回车”(跳入较低的单元格),撇号将不可见。我不知道如何解决这个问题,你能帮我吗?生成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');
    

    你的“安全分析师”没有告诉你,你正在使用一个已经三年没有被开发人员接触过的库吗?你应该更新你的代码以使用PHPSReadSheet。不,他没有告诉你。他没有分析代码,只是搜索易受攻击的请求。我知道这个软件包是“废弃”的,作曲家经常向我展示这方面的信息。也许是时候使用更新的软件包了。我们将在几天后做出决定。