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

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

[PHP] Автобан, или как автоматически заблокировать доступ к сайту

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

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

impuLse #IT

Администратор
Команда форума
Регистрация
12.03.2015
Сообщения
899
Реакции
449
Баллы
35
  • Автор темы
  • Администратор
  • #1
Любой вебмастер рано или поздно сталкивается с проблемой защиты своего сайта от слишком частого обращения к страничкам сайта с какого-либо IP адреса. Хорошо, если в этот момент вебмастер находится у компьютера и может вручную забанить IP, с которого идет DDoS атака или скачивание сайта. Но что делать, если Вы далеко от компьютера? Ведь нельзя же постоянно быть за монитором и отслеживать подобные ситуации.

Предлагаем Вам воспользоваться простым PHP скриптом автоматической блокировки доступа к сайту, при превышении определенного количества запросов к страничкам сайта за указанный промежуток времени.

Для работы нашего скрипта автобана необходима поддержка хостингом MySQL.
В MySQL необходимо будет создать две таблицы: all_visits и black_list_ip.
В all_visits мы будем помещать информацию об IP адресе посетителя и времени обращения к страничке. В black_list_ip будут храниться IP адреса, доступ на сайт которым будет запрещен.

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

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

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

После того, как таблицы в MySQL были созданы, в начало Ваших страничек поместите PHP код:
PHP:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP']))
    $ip=$_SERVER['HTTP_CLIENT_IP'];
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else $ip=$_SERVER['REMOTE_ADDR'];
$bot=$_SERVER['HTTP_USER_AGENT'];

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!='Yandex' and $bot!='Google' and $bot!='Yahoo' and $bot!='Mail') {

$link=mysql_connect(Хост,Логин,Пароль) or die("Could not connect: ".mysql_error());
mysql_select_db("Имя базы", $link);

 $result=mysql_query("INSERT INTO all_visits (ip,date)
         VALUES ('".$ip."','".time(true)."')");
 $result=mysql_query("SELECT count(id) FROM all_visits
         WHERE (ip='".$ip."' and date>'".(time(true)-10)."') LIMIT 1", $link);
 $count_visit=mysql_fetch_array($result);

 if ($count_visit[0]>10) {
  $result=mysql_query("INSERT INTO black_list_ip (ip) VALUES ('".$ip."')");

  $file_htaccess=".htaccess";

  $lines_htaccess[]="Order Allow,Deny\r\n";
  $lines_htaccess[]="Allow from all\r\n";

  $result=mysql_query("SELECT ip FROM black_list_ip ORDER BY INET_ATON(ip)", $link);
  $number=mysql_num_rows($result);

  for ($n=1; $n<=$number; $n++) {
   $htaccess_ip=mysql_fetch_array($result);
   $lines_htaccess[]="Deny from ".$htaccess_ip["ip"]."\r\n";
  }

  file_put_contents($file_htaccess, $lines_htaccess);
 }
}
?>
Данный PHP код, при каждом обращении к страничке, проверяет поисковая система это или нет. Если это не поисковая система, помещает текущее время и IP адрес в таблицу all_visits.

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

Далее перезаписывается файл .htaccess, с уже добавленным только что заблокированным IP, тем самым запрещая ему доступ к сайту
Таким образом можно автоматически заблокировать доступ к сайту для тех IP адресов, которые делают более 10 обращений к сайту за 10 секунд. Минусом данного способа является то, что в бан могут угодить нужные роботы, HTTP_USER_AGENT которых мы не указали. Так же идет небольшое увеличение нагрузки на сервер из-за того, что при каждом обращении к страничке в базу записывается время и IP адрес посетителя, после чего идет запрос о количестве обращений за последнее время.

Обратите внимание, что файл .htaccess будет перезаписан заново, и все, что не указано в данном скрипте, будет удалено!

Так же стоит обратить внимание на конец строк в скрипте - \r\n. В некоторых случаях для обозначения конца строки достаточно оставлять просто \n.

Данный скрипт, пройдя серьезную доработку, работает и на нашем сайте, успешно запрещая доступ и защищая сайт от частого обращения.
 
shape1
shape2
shape3
shape4
shape7
shape8
Сверху Снизу