Добро пожаловать в Forum.iCoder.Uz

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему вы сможете создавать темы, публиковать ответы на существующие темы, повышать репутацию других участников, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?

[PHP] Временная блокировка доступа к сайту

Информация о теме

О теме Здравствуйте, вы читаете тему Временная блокировка доступа к сайту созданную в в разделе PHP для начинающих пользователем impuLse #IT. Эта тема была просмотрена 1 449 раз(а), получила 1 комментариев и 0 очки реакции...
Название категории PHP для начинающих
Название темы Временная блокировка доступа к сайту
Автор темы impuLse #IT
Дата начала
Ответы
Просмотры
Количество реакций
Последнее сообщение AdamPa

impuLse #IT

Администратор
Команда форума
Регистрация
12.03.2015
Сообщения
899
Реакции
449
Баллы
35
  • Автор темы
  • Администратор
  • #1
Для работы нашего скрипта временного автобана необходима поддержка хостингом MySQLi.
В MySQL необходимо будет создать две одинаковые таблицы: all_visits и black_list_ip.
В all_visits мы будем помещать IP адреса посетителей и время их обращения к страничке.
В black_list_ip будут храниться забаненные IP адреса и время, когда они были забанены.

Структура данных таблиц приведена на рисунках ниже:
58b2ff24a52ad.png

Таблица all_visits.
58b2ff24a52ad.png

Таблица black_list_ip.
В обеих таблицах в поле id напротив AUTO_INCREMENT должна стоять галочка! При необходимости в дальнейшем данные таблицы могут быть расширены для хранения дополнительной информации (сколько раз банился конкретный IP и т.д.).

После того, как оде таблицы в MySQL были созданы, в самое начало Ваших страничек поместите следующий PHP код:
PHP:
<?php
$bot='';
$ip=$_SERVER['REMOTE_ADDR'];

if (strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex')) $bot='Yandex';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Google')) $bot='Google';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Yahoo')) $bot='Yahoo';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mail')) $bot='Mail';

if ($bot=='') {
$db=mysqli_connect("localhost","логин","пароль","имя_бд");

 $res=mysqli_query($db,"INSERT INTO all_visits (ip,date) VALUES
     (INET_ATON('".$ip."'),'".time()."')");
 $res=mysqli_query($db,"SELECT count(id) FROM all_visits WHERE
     (ip=INET_ATON('".$ip."') and date>'".(time()-10)."') LIMIT 1");
 $count_visit=mysqli_fetch_array($res);

 if ($count_visit[0]>10) {
 $res=mysqli_query($db,"INSERT INTO black_list_ip (ip,date) VALUES
     (INET_ATON('".$ip."'),'".time()."')");

 $start_line=0;
 $lines='';
 $ln_hta='';

 $fh=fopen(".htaccess", "a+");
 flock($fh, LOCK_EX);
 fseek($fh, 0);
 while (!feof($fh)) $lines.=fread($fh,2048);
 $lines=explode("\n", $lines);

  for ($n=0; $n<=count($lines); $n++) {
   if (strstr($lines[$n],"Order Allow,Deny")) $start_line=$n;
  }
  if ($start_line!=0) for ($n=0; $n<$start_line; $n++) $ln_hta[]=$lines[$n];
  else $ln_hta=$lines;

  $ln_hta[]="Order Allow,Deny";
  $ln_hta[]="Allow from all";

  $res=mysqli_query($db,"SELECT INET_NTOA(ip) AS ip,date FROM black_list_ip
      ORDER BY INET_ATON(ip)");
  while ($bad_ip=mysqli_fetch_array($res)) {
   if (time()<($bad_ip[date]+900))$ln_hta[]=" deny from ".$bad_ip[ip];
  }

  $ln_hta=implode("\n",$ln_hta);
  ftruncate($fh, 0);
  fwrite($fh, $ln_hta);
  flock($fh, LOCK_UN);
  fclose($fh);
 }
}
?>
Данный PHP код, при каждом обращении к страничке, проверяет поисковая система это или нет. Если это не поисковая система, то помещает текущее время и IP адрес в таблицу all_visits.

Далее проверяется, какое количество обращений к сайту было за последние 10 секунд с данного IP адреса. Если количество обращений больше 10, то IP адрес посетителя помещается в таблицу black_list_ip и перезаписывается файл .htaccess, с уже добавленным только что заблокированным IP адресом, тем самым запрещая ему доступ к сайту.

Теперь необходимо чистить MySQL базу от ненужных записей и снимать баны с IP адресов через указанные промежутки времени. Для этого поместите следующий PHP код в файл, который необходимо запускать раз в пять минут по CRON-у (или любым другим способом):
PHP:
<?php
$db=mysqli_connect("localhost","логин","пароль","имя_бд");

$res=mysqli_query($db,"DELETE FROM black_list_ip WHERE date<".(time()-900)."");
$res=mysqli_query($db,"DELETE FROM all_visits WHERE date<".(time()-900)."");

$start_line=0;
$lines='';
$ln_hta='';

$fh=fopen(".htaccess", "a+");
flock($fh, LOCK_EX);
fseek($fh, 0);
while (!feof($fh)) $lines.=fread($fh,2048);
$lines=explode("\n", $lines);

for ($n=0; $n<=count($lines); $n++) {
 if (strstr($lines[$n],"Order Allow,Deny")) $start_line=$n;
}
if ($start_line!=0) for ($n=0; $n<$start_line; $n++) $ln_hta[]=$lines[$n];
else $ln_hta=$lines;

$ln_hta[]="Order Allow,Deny";
$ln_hta[]="Allow from all";

$res=mysqli_query($db,"SELECT INET_NTOA(ip) AS ip,date FROM black_list_ip
    ORDER BY INET_ATON(ip)");
while ($bad_ip=mysqli_fetch_array($res)) {
 if (time()<($bad_ip[date]+900))$ln_hta[]=" deny from ".$bad_ip[ip];
}

$ln_hta=implode("\n",$ln_hta);
ftruncate($fh, 0);
fwrite($fh, $ln_hta);
flock($fh, LOCK_UN);
fclose($fh);
?>
Таким образом, скрипт позволяет автоматически заблокировать доступ к сайту для тех IP адресов, которые делают более 10 обращений к сайту за 10 секунд. Минусом данного скрипта является то, что в бан могут угодить нужные роботы, HTTP_USER_AGENT которых мы не указали. Стоит учитывать и тот факт, что скрипт дает небольшое увеличение нагрузки на сервер из-за того, что при каждом обращении к страничке в базу записывается время и IP адрес посетителя, после чего идет запрос о количестве обращений за последнее время.

От серьезной атаки или хитрого юзера скрипт конечно не спасет, но зато поможет отсеять много бесполезных ботов и программ качалок, которые используют один IP адрес.
 

AdamPa

Пользователь
Регистрация
28.05.2019
Сообщения
2
Реакции
0
Баллы
0
Спасибо за ответ А по оперативной памяти как быть??
 
shape1
shape2
shape3
shape4
shape7
shape8
Сверху Снизу