Аналитик по безопасности заметил дыру в безопасности в нашей специализированной CRM: документы Excel, сгенерированные PHP-пакетом phpoffice / phpexcel, могут содержать вредоносные макрокоманды.Данные для документов Excel, взятые из базы данных, могут содержать эти вредоносные макросы, введенные каким-либо образом.Он дал 2 рекомендации, как удалить это отверстие:
- Удалить символы '=', '@', '+', '-', если они находятся в начале ячейки документа (это было реализованои все в порядке).
- Добавьте апостроф (') в начале ячейки каждого документа (этот апостроф означает «начало комментария на языке VB», или около того ...).
Проблема со второй рекомендацией.Я добавил апостроф в начале каждой ячейки документа.Апостроф должен быть невидимым, но он виден в сгенерированном документе.Когда я открываю сгенерированный документ, фокусирую курсор на ячейке и нажимаю «ввод» (чтобы перейти в нижнюю ячейку), апостроф становится невидимым.Я не знаю, как решить эту проблему, вы можете мне помочь?Основной код, который генерирует документ Excel, приведен ниже.
Может быть, вы знаете альтернативные решения, как предотвратить выполнение вредоносных макросов в документе Excel, который генерируется phpExcel?
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');