Вход Регистрация
Файл: 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>
        &raquo; <a href='/rules.php'>Вспомнить правила</a><br />
        &raquo; <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&amp;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&amp;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&amp;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 ($textENT_QUOTES'UTF-8'))); 
}    

function 
out ($text)
{
return 
bbcode (links (htmlentities ($textENT_QUOTES'UTF-8')));
}

$guard = new guard;
?>
Онлайн: 1
Реклама