Файл: inc/guard_sys.php
Строк: 321
<?php
class guard
{
var $user, $time, $sets, $offense, $dossierQueries, $guardAdmin;
function __construct ()
{
global $user, $time, $guardSets, $guardNotes, $guardNotesWrite, $guardAdmin;
$this->guardAdmin = $guardAdmin;
$this->time = &$time;
$this->sets = &$guardSets;
$this->notes = &$guardNotes;
if (($this->time - $guardNotes['other']['digest']) > 600 && !empty ($guardNotes['other']['digest']) && !defined ('DIGEST') && !defined ('INSTALL'))
{
header ('Location: /guard/system/');
}
$guardNotesWrite->write ('other', 'digest', $this->time);
if (isset ($user))
{
$this->user = &$user;
$this->uid = $user['id'];
}
else
{
$this->user['nick'] = 'Неизвестный пользователь';
$this->user['id'] = 0;
$this->uid = 0;
$this->user['pol'] = 1;
}
}
/* Проверка на нулость */
function not_null ($var)
{
if (empty ($var))
return 'пусто';
else
return $var;
}
function urlName ($url)
{
if (preg_match ('/$adm_panel//i', $url))
return 'админ-панель';
elseif (preg_match ('//chat//i', $url))
return 'чат';
elseif (preg_match ('//forum//i', $url))
return 'форум';
elseif (preg_match ('//obmen//i', $url))
return 'обменник';
elseif (preg_match ('//loads//i', $url))
return 'загрузки';
elseif (preg_match ('//votes//i', $url))
return 'голосования';
elseif (preg_match ('//guest//i', $url))
return 'гостевая';
elseif (preg_match ('/info.php/i', $url))
return 'анкета';
elseif (preg_match ('//foto//i', $url))
return 'фотоальбомы';
elseif (preg_match ('//lib//i', $url))
return 'библиотека';
elseif (preg_match ('//news//i', $url))
return 'новости';
elseif (preg_match ('/index.php/i', $url))
return 'главная';
elseif (preg_match ('/aut.php/i', $url))
return 'вход';
elseif (preg_match ('/reg.php/i', $url))
return 'регистрация';
elseif (preg_match ('/mail.php/i', $url))
return 'почта';
elseif (preg_match ('/konts.php/i', $url))
return 'контакты';
elseif (preg_match ('/users.php/i', $url))
return 'пользователи';
elseif (preg_match ('/online.php/i', $url))
return 'пользователи on-line';
else
return 'название не определено';
}
function logs ()
{
global $guardNotesWrite;
$result = null;
$while = mysql_query ("SELECT * FROM `guard_tracking`");
while ($step = mysql_fetch_assoc ($while))
{
if (empty ($step['user']))
$stepUserNick = '<font color="red">Гость</font>';
else
{
$stepUserProf = get_user ($step['user']);
$stepUserNick = '<a href="/info.php?id='.$stepUserProf['id'].'">'.$stepUserProf['nick'].'</a>';
}
/* Статус входа/выхода */
$aut = null;
if ($step['user'] != 0)
{
if ($step['aut_status'] == 1)
$aut = '<font color="green">[вошел]</font>';
elseif ($step['aut_status'] == 2)
$aut = '<font color="red">[вышел]</font>';
elseif ($step['aut_status'] == 3)
$aut = '<font color="orange">[зашел/вышел]</font>';
}
$method = ($step['query_string']?'GET':null).' '.($step['method'] == 'GET'?null:'POST');
$result .= '<div class="post">
<img src="/guard/icons/step.png" alt="" /> '.$step['id'].') <b>'.$stepUserNick.' '.$aut.'</b> ('.vremja ($step['time']).')<br />
<b>Браузер/ОС</b>: '.$this->not_null ($step['user_agent']).'<br />
<b>IP</b>: '.$this->not_null ($step['ip']).'<br />
<b>Proxy IP</b>: '.$this->not_null ($step['proxy_ip']).'<br />
<b>Referer</b>: '.$this->not_null ($step['referer']).'<br />
<b>URL</b>: '.$step['php_self'].($step['query_string']?'?'.$step['query_string']:null)."<br />
<b>Методы</b>: ".($method == ' '?'пусто':$method)."<br />
<b>Модуль</b>: ".$this->urlName ($step['php_self'])."<br />
<b>Генерация</b>: ".$step['generation'].' сек';
if (mysql_num_rows (mysql_query ("SELECT `id` FROM `guard_dossier` WHERE `step` = '$step[id]'")))
{
$dossier = mysql_fetch_assoc (mysql_query ("SELECT * FROM `guard_dossier` WHERE `step` = '$step[id]' LIMIT 1"));
$result .= '<br /><font color="red"><b>Нарушение</b>: '.$this->cause ($dossier['section'], $dossier['type']).'</font>';
}
$result .= '</div>';
}
$logs = @fopen (H.'guard/logs/'.date ('d.m.y', $this->time).'.txt', 'w');
@fwrite ($logs, $result);
@fclose ($logs);
@chmod (H.'guard/logs/'.date ('d.m.y', $this->time).'_'.str_replace (' ', '_', vremja ($this->time)).'.txt', 0777);
mysql_query ("DELETE FROM `guard_tracking`"); //удаляем старые данные
$guardNotesWrite->write ('tracking', 'last_cleaning', $this->time);
}
function filtText ($text)
{
return in ($text);
}
/* Определяет причину */
function cause ($section, $type = null)
{
global $guardCauses;
if (!preg_match ('/_$/', $type) && $type)
$type .= '_';
return $guardCauses[$section][$type.'cause'];
}
/* Определяет адрес шага */
function step ($id)
{
if (!$step = assocArray ('guard_tracking', $id))
return 'информация о переходе не определена';
return "<a href='$step[php_self]".($step['query_string']?'?'.$step['query_string']:null)."'>$step[php_self]".($step['query_string']?'?'.$step['query_string']:null)."</a> (<a href='/guard/tracking/?step=$step[id]'>подробнее</a>)";
}
/* Запись в досье */
function dossier ($section, $type = null, $msg = null)
{
global $dossierStep;
$dossierStep = 1;
mysql_query ("INSERT INTO `guard_dossier` (`user`, `section`, `type`, `msg`, `time`) VALUES ('$this->uid', '$section', '$type', '$msg', '$this->time')");
}
function email ($msg = null, $nmsg = null)
{
mail ($this->sets['notifications']['email'], 'SiteGuard2 - notification', $msg);
}
/* Наказание пользователя */
function punish ($section, $type = null)
{
global $punishStep;
if ($type)
$type .= '_';
/* Если заец, то заменяем наказание на ошибку */
if (empty ($this->uid))
$this->sets[$section][$type.'punish'] = 'error';
if ($this->sets[$section][$type.'punish'] == 'ban')
{
/* Выдаем БАН */
if (mysql_num_rows (mysql_query ("SELECT `id` FROM `ban` WHERE `id_user` = '$this->uid'")))
/* Что бы не засрал БД сцука */
mysql_query ("UPDATE `ban` SET `time` = `time` + '600' WHERE `id_user` = '$this->uid'");
else
mysql_query ("INSERT INTO `ban` (`id_user`, `id_ban`, `prich`, `time`) VALUES ('$this->uid', '0', '".$this->cause ($section, $type)."', '".(($this->time + $this->sets[$section][$type.'punish_time'] * 3600))."')");
header ("Location: /index.php");
}
elseif ($this->sets[$section][$type.'punish'] == 'delay')
{
/* Извещаем пользователя о подозрении на нарушение правил */
/* Временно ограничеваем деятельность пользователя */
if (mysql_num_rows (mysql_query ("SELECT * FROM `guard_suspects` WHERE `user` = '$this->uid'")) == 0)
{
if (!$this->guardAdmin)
{
$punishStep = 1;
mysql_query ("INSERT INTO `guard_suspects` (`user`, `cause`, `time`) VALUES ('$this->uid', '".$this->cause ($section, $type)."', '$this->time')");
}
header ("Location: /delay.php");
}
}
else
{
/* Выводим ошибку, даже если настройка не установлена */
title ();
aut ();
echo '<div class="err">Ошибка действия<br /> Причина: '.$this->cause ($section, $type)."</div>
» <a href='/rules.php'>Вспомнить правила</a><br />
» <a href='/index.php'>Перейти на главную страницу</a>";
require H.'sys/inc/tfoot.php';
}
/* Что б херос не ломанул ничего, даже после предупреждения, тушим процесс */
}
function notific ($section, $type = null)
{
static $icq;
require H.'guard/inc/webIcq.php';
$icq = new WebIcqLite();
if ($type)
$type .= '_';
if ($this->sets[$section][$type.'notification'])
{
$msg = "Обнаружена угроза безопасности сайта%br%
Пользователь: %user%%br%
Причина: ".$this->cause ($section, $type)."%br%
Время обнаружения: ".vremja ($this->time)."%br%
";
if ($this->guardAdmin)
$msg .= "Система SiteGuard2 устранила источник опасности, но будет логично узнать о действии пользователя более детально.%br%
";
$msg .= 'Рекомендуется уделить больше внимания действиям этого пользователя, так как попытки взлома могут повториться';
/* Уведомление по внутренней почте */
if ($this->sets['notifications']['mail_notific'])
{
$msg = str_replace ('%br%', '', $msg);
$msg2 = str_replace ('%user%', "[url=/info.php?id=".$this->uid."]".$this->user['nick']."[/url]", $msg);
$msg = str_replace ('%user%', "[url=/info.php?id=".$this->uid."]".$this->user['nick']."[/url] ([url=/guard/dossier/violations.php?filters_status=1&user=".$this->uid."]история нарушений[/url])", $msg);
$params = '`id` = 1';
if ($this->sets['notifications']['admins_notific'])
$params .= ' OR (`group_access` > 7 AND `group_access` < 15)';
if ($this->sets['notifications']['moders_notific'])
$params .= ' OR (`group_access` <= 7 AND `group_access` > 1)';
$sendNotif = mysql_query ("SELECT * FROM `user` WHERE $params");
while ($send = mysql_fetch_assoc ($sendNotif))
{
mysql_query ("INSERT INTO `mail` (`id_user`, `id_kont`, `msg`, `time`) VALUES ('0', '$send[id]', '$msg2', '$this->time')");
}
}
/* Уведомление по e-mail */
if ($this->sets['notifications']['email_notific'])
{
$msg = str_replace ('%br%', '<br />', $msg);
$msg = str_replace ('%user%', "<a href='/info.php?id=".$this->uid."'>".$this->user['nick']."</a> (<a href='/guard/dossier/violations.php?filters_status=1&user=$prof[id]'>история нарушений</a>)", $msg);
$this->email ($this->sets['notifications']['email'], 'Защитник SiteGuard 2 - оповещение', $msg);
}
/* Уведомление по ICQ */
if ($this->sets['notifications']['icq_notific'])
{
$msg = str_replace ('%br%', '', $msg);
$msg = str_replace ('%user%', "{$this->user[nick]} http://{$_SERVER[HOST_NAME]}/info.php?id=".$this->uid, $msg);
if ($icq->connect ($this->sets['notifications']['icq_num'], $this->sets['notifications']['icq_pass']))
{
$icq->send_message ($this->sets['notifications']['admin_icq'], $msg);
$icq->disconnect ();
}
/* Дописать уведомления по ICQ */
}
}
}
/* Вывод информации о пользователе */
function showUser ($prof, $guard = false)
{
global $set, $doc;
if (!is_array ($prof))
$prof = get_user ($prof);
$icon = null;
if ($guard)
{
if ($guard == 1)
$icon = $doc->icon ('shield_red');
else
$icon = null;
}
else
$icon = "<img src='/style/themes/$set[set_them]/user/$prof[pol].png' alt='' />";
return "$icon <a href='/info.php?id=$prof[id]'>$prof[nick]</a> (<a href='/guard/dossier/violations.php?filters_status=1&user=$prof[id]'>история нарушений</a>)";
}
function __destruct ()
{
global $msec, $sec, $conf, $guardNotesWrite, $dossierStep, $punishStep;
list ($msec, $sec) = explode (chr (32), microtime ());
$generation = round (($sec + $msec) - $conf['headtime'], 3);
$avgGener = mysql_query ("SELECT AVG(`generation`) FROM `guard_tracking` LIMIT 20");
if ($generation < $avgGener)
{
if (!$this->sets['tracking']['time'])
$this->sets['tracking']['time'] = 86400;
else
$this->sets['tracking']['time'] = $this->sets['tracking']['time'] * 86400;
if (($this->time - $this->sets['tracking']['time']) > $this->notes['tracking']['last_cleaning'])
{
if ($this->sets['tracking']['cleaning'] == 'logs')
$this->logs ();
elseif ($this->sets['tracking']['cleaning'] == 'delete')
mysql_query ("DELETE FROM `guard_tracking`");
$guardNotesWrite->write ('tracking', 'last_cleaning', $this->time);
}
$aut = 0;
if (mysql_num_rows (mysql_query ("SELECT `id` FROM `guard_tracking`")))
{
$lastStep = assocArray ('guard_tracking', '`user` = '.$this->uid, '`time` DESC');
if (!$lastStep)
$lastStep['time'] = 999999999;
if (($this->time - $lastStep['time']) > 600)
{
$aut = 1;
if ($lastStep['aut_status'] > 0)
$autStatus = 3;
else
$autStatus = 2;
mysql_query ("UPDATE `guard_tracking` SET `aut_status` = '$autStatus' WHERE `id` = '$lastStep[id]' LIMIT 1");
}
else
$aut = 0;
}
/* Взято с http://thiswap.com/2010/08/16/uznaem-realnyj-ip-adres-i-user-agent-v-operamini/ */
/* Начало позаимствованного кода */
if (preg_match ("/Opera Mini/i", $_SERVER['HTTP_USER_AGENT']))
{
preg_match_all ("|([0-9]{1,3}.){3}[0-9]{1,3}|", $_SERVER['HTTP_X_FORWARDED_FOR'], $arr_ip);
$_SERVER['REMOTE_ADDR'] = $arr_ip[0][0];
if (empty ($_SERVER['REMOTE_ADDR']))
$_SERVER['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
$_SERVER['HTTP_USER_AGENT'] = "Opera Mini/ ".$_SERVER['HTTP_X_OPERAMINI_PHONE_UA'];
if (empty ($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']))
$_SERVER['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
}
/* Конец позаимствованного кода */
mysql_query("INSERT INTO `guard_tracking` (`user`,`aut_status`,`user_agent`,`ip`,`proxy_ip`,`referer`,`method`,`php_self`,`query_string`,`generation`,`time`) VALUES ('$this->uid','$aut','".in ($_SERVER['HTTP_USER_AGENT'])."','".in ($_SERVER['REMOTE_ADDR'])."','".in ($_SERVER['REMOTE_ADDR'])."','".(isset ($_SERVER['HTTP_REFERER'])?in ($_SERVER['HTTP_REFERER']):null)."','".in ($_SERVER['REQUEST_METHOD'])."','".in ($_SERVER['PHP_SELF'])."','".in ($_SERVER['QUERY_STRING'])."','$generation','$this->time')");
$step = mysql_insert_id ();
if (isset ($punishStep))
{
mysql_query ("UPDATE `guard_suspects` SET `step` = '$step' ORDER BY `id` DESC LIMIT 1");
}
if (isset ($dossierStep))
{
mysql_query ("UPDATE `guard_dossier` SET `step` = '$step' ORDER BY `id` DESC LIMIT 1");
}
}
@$guardNotesWrite->updateFile ();
}
}
/* Получение ассоциативного массива */
function assocArray ($tbl, $pars = null, $order = null)
{
if (is_numeric ($pars))
$pars = '`id` = '.intval ($pars);
if ($pars !== null)
$pars = 'WHERE '.$pars;
if ($order !== null)
$order = 'ORDER BY '.$order;
if (($mass = mysql_fetch_assoc (mysql_query ("SELECT * FROM `$tbl` $pars $order LIMIT 1"))))
return $mass;
else
return false;
}
/* Фильтр входящей информации */
function in ($text)
{
return mysql_real_escape_string (stripslashes (htmlentities ($text, ENT_QUOTES, 'UTF-8')));
}
function out ($text)
{
return bbcode (links (htmlentities ($text, ENT_QUOTES, 'UTF-8')));
}
$guard = new guard;
?>