Контроль раздачи базы данных nod32php


Список пользователей nod32

Скрипт на php собирает данные о подключившихся клиентах nod32 к серверу обновления,
и контролирует условия для раздачи базы данных.
Данный скрипт уже умеет блокировать клиентов nod32 по ip или HWF.
Проверяет настройку eset Live Grid (убраны ли галочки в интерфейсе программы nod32 или нет).
Можете создавать свои условия, для этого Вам поможет переменная с массивом $arrFullInfo.
По правилу планировщика антивируса nod32 проверяет обновления раз в 60 минут.

Для начала, нужно перехватывать запросы к файлам «update.ver» и перенаправлять их php скрипту.
Реализуем с помощью «.htaccess»

# .htaccess
RewriteCond %{HTTP_USER_AGENT} ^ESS.*BPC.(5|6|7|8|9) [NC]
RewriteRule ^update.ver$ /update.ver.php [L]

В скобках версии nod32.
Если используйте корневой путь к БД, добавьте:

...
# v9
RewriteCond %{HTTP_USER_AGENT} ^ESS.*BPC.9 [NC]
RewriteCond %{REQUEST_URI} !^/upd_bd/v9/ [NC]
RewriteRule ^(.*).nup$ /upd_bd/v9/$1.nup [L]

# v8
RewriteCond %{HTTP_USER_AGENT} ^ESS.*BPC.8 [NC]
...

Файл «update.ver.php»
При первом подключении антивируса к базе nod32, скрипт создаст пользовательскую папку. Всех последующих подключившихся будет хранить там и обновлять данные о клиенте.
Параметры и значения данных о клиенте nod32 смотрите таблицу по ссылке.

// php 5.2

$PathBD = "/home/USERNAME/public_html/upd_bd/"; // путь от корня сервера к общим папкам БД
$folderBD = 'v'; // начальное название папки БД, версия бд определиться автоматически из HTTP_USER_AGENT
$folderUsers = 'user'; // Папка с пользовательскими данными.
$ban= array('91.77.130.150','91.78.101.3'); // блокирование по HWF или IP
$LiveGrid = "(1|0).0.0"; // система репутации Eset Live Grid (regex)
date_default_timezone_set('Europe/Moscow'); // часовой пояс

// проверяем, действительно ли это nod32
if (!preg_match("/^ESS Update \((.*)\)$/iu",trim($_SERVER["HTTP_USER_AGENT"]))) {
	header($_SERVER['SERVER_PROTOCOL']." 401 Unauthorized");
	exit('<h1>401 Unauthorized</h1>');
} else {
	# собираем данные
	# парсим http_user_agent, и помещаем в массив
	preg_match_all('/(\w+):?(?:\s+((?:\s*[^;\s]+)*))?/', substr($_SERVER["HTTP_USER_AGENT"], 12, -1), $arrUSER_AGENT);
	$arrFullInfo = array_combine($arrUSER_AGENT[1], $arrUSER_AGENT[2]); // комбинируем оба массива
	# дописываем в массив другие данные:
	if(isset($_SERVER['HTTP_X_ESET_UPDATEID'])) $arrFullInfo['HTTP_X_ESET_UPDATEID'] = preg_replace('/[^a-zа-я0-9\s-_@#().$%+]/iu', '*', trim($_SERVER['HTTP_X_ESET_UPDATEID']));
	$arrFullInfo['REQUEST_TIME'] = date("d.m.y/H:i:s",$_SERVER['REQUEST_TIME']);
	if(isset($_SERVER['HTTP_X_NOD32_MODE'])) $arrFullInfo['HTTP_X_NOD32_MODE'] = htmlspecialchars($_SERVER['HTTP_X_NOD32_MODE']);
	if(isset($_SERVER['REQUEST_URI'])) $arrFullInfo['REQUEST_URI'] = basename(trim(htmlspecialchars($_SERVER['REQUEST_URI'])));
	if(isset($_SERVER['HTTP_REFERER'])) $arrFullInfo['HTTP_REFERER'] = htmlspecialchars($_SERVER['HTTP_REFERER']);
	$arrFullInfo['REMOTE_ADDR'] = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP);
	
	# запись событий. 
	function noticeLog($msg, $globs) {
		global $folderUsers, $arrFullInfo;
		// преобразовываем массив в 1 строчку (костыль)
		function arrInLine($reline) {
			$z = str_replace(array("\n"," ",","),array('','',', '),var_export($reline,true));
			return $z;
		}
		$str = '['.date('d.m.y / H:i:s').'] '.$msg."\n".arrInLine($arrFullInfo);
		if($globs) {
			unset($GLOBALS['arrFullInfo']); 
			unset($GLOBALS['arrUSER_AGENT']); 
			unset($GLOBALS['HTTP_USER_AGENT']);
			$str .= "\n".arrInLine($GLOBALS); 
		}
		$str .= "\n\r";
		@file_put_contents($folderUsers.'/_NOTICE.log', $str, FILE_APPEND);
		return false;
	}
	
	# Черный список:
	if(in_array($arrFullInfo['REMOTE_ADDR'], $ban) OR (isset($arrFullInfo['HWF'])? in_array($arrFullInfo['HWF'], $ban) : false ) ) {
		noticeLog('ban user | http code 404');
		header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
		exit('<h1>404 Not Found</h1>');
	}

	# проверяем настройки антивируса:
	// проверяем на Live Grid
	if(isset($arrFullInfo['CL']) & !preg_match("/^".$LiveGrid."$/",$arrFullInfo['CL'])) {
		noticeLog('Detect Live Grid | http code:403 | line code:'.__LINE__ , 1);
		header($_SERVER['SERVER_PROTOCOL']." 403 Forbidden");
		exit('403 Forbidden');
	}

	# берем из массива версию nod32
	$nodVersion = substr($arrFullInfo['BPC'], 0, strpos($arrFullInfo['BPC'], '.' ));
	
	# записываем настройки антивируса в файл
	if(isset($arrFullInfo['HTTP_X_ESET_UPDATEID'])) {
		$NameUser = $arrFullInfo['HTTP_X_ESET_UPDATEID']; 
	} else {
		$NameUser = $_SERVER['REMOTE_ADDR'];
	}
	$filename = $folderUsers.'/'.$folderBD.$nodVersion.'-'.$NameUser.'.txt'; // имя файла
	@file_put_contents($filename, var_export($arrFullInfo,true));
	
	# проверяем существование БД
	if(!file_exists($PathBD.$folderBD.$nodVersion.'/update.ver')) {
		header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
		exit('<h1>404 Not Found</h1>');
	} else {
		# отдаем файл
		header('Content-Type: application/octet-stream');
		header('Content-Length: '. filesize($PathBD.$folderBD.$nodVersion.'/update.ver'));
		echo file_get_contents($PathBD.$folderBD.$nodVersion.'/update.ver');
		exit();
	}
}

Для визуального удобства, просмотра пользователей, можно включить листинг файлов на web сервере.
Например индивидуальная настройка которая заточеная под apache.
В пользовательской папке с данными создадим «.htaccess» и пишем:

# .htaccess
# Listing files
<IfModule mod_autoindex.c>
	Options +Indexes 
	IndexOptions FancyIndexing
	IndexOrderDefault Descending Date
	ReadmeName "_NOTICE.log"
	IndexIgnore "_*"
</IfModule>
nod32 автоотслеживание параметра в реестре при установки антивируса
nod32 скрипт для удаленного запуска обновления
Eset nod32 http header
Все о nod32