• Модуль: 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;
}