Файл: vzabave/sys/ip.php
Строк: 47
<?php
##########################################
## Автор: -=ШАХТЕР=- # ## Сайт: http://masteram.us # ## ICQ : 46-92-90 # ## Версия 4.0 #
## Данная версия скрипта является ПЛАТНОЙ, #
## вы НЕ ИМЕЕТЕ ПРАВА распрострянять данный #
## скрипт или какие-либо части его кода... #
#########################################
class ipinit {
public $ip; // IP адрес в LONG формате
public $flood_chk = 1; // Включение - выключение функции 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($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++;
}
$sys[] = $arr;
}
fseek($in, 0);
ftruncate($in, 0);
for ($i = 0; $i < count($sys); $i++) {
fwrite($in, pack('LL', $sys[$i]['ip'], $sys[$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;
}
}
?>