- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/vuln_scanner.php
- Класс: CQAACheckListTests
- Вызов: CQAACheckListTests::checkVulnerabilities
public function checkVulnerabilities($arParams)
{
if(extension_loaded('tokenizer') === true)
{
if(empty(BitrixMainApplication::getInstance()->getSession()['BX_CHECKLIST'][$arParams['TEST_ID']]))
BitrixMainApplication::getInstance()->getSession()['BX_CHECKLIST'][$arParams['TEST_ID']] = Array();
$NS = &BitrixMainApplication::getInstance()->getSession()['BX_CHECKLIST'][$arParams['TEST_ID']];
$arScanParams = self::defineScanParams();
$phpMaxExecutionTime = ini_get("max_execution_time");
$arScanParams['time_out'] = $phpMaxExecutionTime > 0 ? $phpMaxExecutionTime - 2: 30;
$arScanParams['time_start'] = time();
$arScanParams['MP_mode'] = false;
if($arParams['STEP'] === 0)
{
$NS = Array();
$NS['CUR_FILE_ID'] = 0;
$NS['FILE_LIST'] = array();
$NS['DIR_LIST'] = array();
self::getFiles(
$arScanParams['path'],
$arScanParams['PREG_FOR_SKIP_SCAN'],
$arScanParams['FILE_TYPES'],
$arScanParams['path'],
$NS['FILE_LIST'],
$NS['DIR_LIST']
);
$NS['VULN_COUNT'] = 0;
$NS['STUCK_FILE'] = -1;
$NS['MESSAGE'] = Array();
}
$time_end = $arScanParams['time_start'] + $arScanParams['time_out'];
while ($NS['DIR_LIST'] && $time_end > time())
{
$dir = array_shift($NS['DIR_LIST']);
self::getFiles(
$dir,
$arScanParams['PREG_FOR_SKIP_SCAN'],
$arScanParams['FILE_TYPES'],
$arScanParams['path'],
$NS['FILE_LIST'],
$NS['DIR_LIST']
);
}
if ($NS['DIR_LIST'])
{
return Array(
'IN_PROGRESS' => 'Y',
'PERCENT' => 0,
);
}
$result=true;
do
{
if(is_file($file = $NS['FILE_LIST'][$NS['CUR_FILE_ID']]))
{
if(isset($output))
unset($output);
if(isset($scan))
unset($scan);
$scan = new CVulnScanner($file, $arScanParams, self::getCurTemplate($file, $arScanParams['MP_mode']));
$result = $scan->process();
if($result !== false)
{
if($scan->vuln_count > 0)
{
$NS['MESSAGE'][$NS['CUR_FILE_ID']]['VULN_COUNT'] = $scan->vuln_count;
$NS['MESSAGE'][$NS['CUR_FILE_ID']]['OUTPUT'] = $scan->getOutput();
}
$NS['CUR_FILE_ID']++;
}
else
{
if($NS['STUCK_FILE'] === $NS['CUR_FILE_ID'])
{
$NS['CUR_FILE_ID']++;
$NS['STUCK_FILE'] = -1;
}
else
$NS['STUCK_FILE'] = $NS['CUR_FILE_ID'];
}
}
else
{
$NS['CUR_FILE_ID']++;
}
} while ($NS['CUR_FILE_ID'] < count($NS['FILE_LIST']) && $result !== false);
if(!($NS['CUR_FILE_ID'] < count($NS['FILE_LIST'])))
{
$arDetailReport = '';
$vulnCount=0;
foreach ($NS['MESSAGE'] as $file_output)
if (!empty($file_output))
if (strpos($arDetailReport, $file_output['OUTPUT']) === false)
{
$arDetailReport .= $file_output['OUTPUT'];
$vulnCount += $file_output['VULN_COUNT'];
}
unset(BitrixMainApplication::getInstance()->getSession()['BX_CHECKLIST'][$arParams['TEST_ID']]);
$arResult = Array(
'MESSAGE' => Array(
'PREVIEW' => GetMessage('VULNSCAN_FIULECHECKED').count($NS['FILE_LIST']).GetMessage('VULNSCAN_VULNCOUNTS').$vulnCount,
'PROBLEM_COUNT' => $vulnCount,
'DETAIL' => $arDetailReport
),
'STATUS' => ($vulnCount > 0 ? false : true)
);
}
else
{
$percent = round(($NS['CUR_FILE_ID']) / (count($NS['FILE_LIST']) * 0.01), 0);
$arResult = Array(
'IN_PROGRESS' => 'Y',
'PERCENT' => number_format($percent, 2),
);
}
}
else
{
$arResult = Array(
'MESSAGE' => Array(
'PREVIEW' => GetMessage('VULNSCAN_TOKENIZER_NOT_INSTALLED'),
),
'STATUS' => false
);
}
return $arResult;
}