Вход Регистрация
Файл: sys/ip.php
Строк: 47
<?php


class ipinit {
public 
$ip;    // IP адрес в LONG формате
public $flood_chk 0;    // Включение - выключение функции IP антифлуда
public $flood_interval '120';    // Интервал времени в секундах
public $flood_limit '50';    // Число разрешенных запросов за интервал (50)
public $flood_file 'shaxty_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(
'НЕ ФЛУДИ!');
}
}

// Получаем реальный адрес 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 
$db$rootpath;
$sys = array();
$requests 1;
if (!
file_exists(H.'files/' $this->flood_file))
$in fopen(H.'files/' $this->flood_file"w+");
else
$in fopen(H.'files/' $this->flood_file"r+");
flock($inLOCK_EX) or die("Cannot flock ANTIFLOOD file.");
$now time();
while (
$block fread($in8)) {
$arr unpack("Lip/Ltime"$block);
if ((
$now $arr['time']) > $this->flood_interval) {
continue;
}
if (
$arr['ip'] == $this->ip) {
$requests++;
}
$sys[] = $arr;
}
fseek($in0);
ftruncate($in0);
for (
$i 0$i count($sys); $i++) {
fwrite($inpack('LL'$sys[$i]['ip'], $sys[$i]['time']));
}
fwrite($inpack('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;
}
}

?>
Онлайн: 0
Реклама