Контроль раздачи базы данных nod32php
Скрипт на 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>