<?php

class ipinit {
    public $ip;    // IP адрес в LONG формате
    public $flood_chk = 0;    // Включение - выключение функции IP антифлуда
    public $flood_interval = 90;    // Интервал времени в секундах
    public $flood_limit = 50;    // Число разрешенных запросов за интервал
    public $flood_file = 'http_antiflood.dat';    // Рабочий файл функции
    private $requests;    // Число запросов с IP адреса за период времени

    function __construct() {
        $this->ip = ip2long($this->getip());
        // Проверка адреса IP на HTTP флуд
        if ($this->flood_chk) {
            $this->requests = $this->reqcount();
            if ($this->requests > $this->flood_limit)
                die('Flood!!!');
        }
    }

    // Получаем реальный адрес IP
    private function getip() {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $this->ip_valid($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        elseif ($_SERVER['REMOTE_ADDR']) {
            return $_SERVER['REMOTE_ADDR'];
        }
        else {
            die('Unknown IP');
        }
    }

    // Счетчик числа обращений с данного IP
    private function reqcount() {
        global $rootpath;
        $tmp = array();
        $requests = 1;
        if (!file_exists($rootpath . $this->flood_file))
            $in = fopen($rootpath . $this->flood_file, 'w+');
        else
            $in = fopen($rootpath . $this->flood_file, 'r+');
        flock($in, LOCK_EX) or die('Cannot flock ANTIFLOOD file.');
        $now = time();
        while ($block = fread($in, 8)) {
            $arr = unpack('Lip/Ltime', $block);
            if (($now - $arr['time']) > $this->flood_interval) {
                continue;
            }
            if ($arr['ip'] == $this->ip) {
                $requests++;
            }
            $tmp[] = $arr;
        }
        fseek($in, 0);
        ftruncate($in, 0);
        for ($i = 0; $i < count($tmp); $i++) {
            fwrite($in, pack('LL', $tmp[$i]['ip'], $tmp[$i]['time']));
        }
        fwrite($in, pack('LL', $this->ip, $now));
        fclose($in);
        return $requests;
    }

    // Валидация IP адреса
    function ip_valid($ip = '') {
        $d = explode('.', $ip);
        for ($x = 0; $x < 4; $x++)
            if (!is_numeric($d[$x]) || ($d[$x] < 0) || ($d[$x] > 255))
                return false;
            return $ip;
    }
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) and preg_match('|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$|',$_SERVER['HTTP_X_FORWARDED_FOR']))
{
	$ip = trim(htmlspecialchars(mysql_real_escape_string($_SERVER['HTTP_X_FORWARDED_FOR'])));
}
elseif(isset($_SERVER['HTTP_CLIENT_IP']) and preg_match('|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$|',$_SERVER['HTTP_CLIENT_IP']))
{
	$ip = trim(htmlspecialchars(mysql_real_escape_string($_SERVER['HTTP_CLIENT_IP'])));
}
elseif(isset($_SERVER['REMOTE_ADDR']) and preg_match('|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$|',$_SERVER['REMOTE_ADDR']))
{
	$ip = trim(htmlspecialchars(mysql_real_escape_string($_SERVER['REMOTE_ADDR'])));
}
else
{
	$ip = 'Скрыт';
}

/* Определение UA посетителя */
if (isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']))
{
	$ua = trim(stripcslashes(htmlspecialchars(mysql_real_escape_string($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']))));
}
elseif (isset($_SERVER['HTTP_USER_AGENT']))
{
	$ua = trim(stripcslashes(htmlspecialchars(mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']))));
}
else
{
	$ua = 'Скрыт';
}
$ua=strtok($ua, '/');
$ua=strtok($ua, ' ');

?>