Скрипт бана для php

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

В одной из наших прошлых тем — Автобан, или как автоматически заблокировать доступ к сайту, мы рассматривали скрипт, который позволял блокировать доступ к сайту для IP адресов, которые слишком часто обращались к страничкам сайта.

Данная тема пользовалась популярностью и уже немного устарела, так что потребовалось ее немного обновить и добавить пару нововведений. Основным отличием данной темы от предыдущей является то, что теперь IP адреса банятся на указанное время, а не навсегда, как это было раньше. Скрипт был переведен на MySQLi и оптимизирован для уменьшения хранимых в MySQL базе данных и увеличения скорости работы БД.

Была добавлена Блокировка файлов от записи на PHP, которая не позволит одному процессу помешать другому при перезаписи файла .htaccess. Так же файл .htaccess перезаписывается не целиком, а с последней найденной строки «Order Allow,Deny», если таковая имеется. Если данная строка не найдена, то забаненные IP адреса добавляются в конец файла .htaccess.

Для работы нашего скрипта временного автобана необходима поддержка хостингом MySQLi.

В MySQL необходимо будет создать две одинаковые таблицы: all_visits и black_list_ip.

В all_visits мы будем помещать IP адреса посетителей и время их обращения к страничке.

В black_list_ip будут храниться забаненные IP адреса и время, когда они были забанены.

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

Таблица, содержащая IP адрес посетителя и время обращения к страничке

Таблица all_visits.

Таблица, содержащая забаненные IP адреса и время бана

Таблица black_list_ip.

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

После того, как оде таблицы в MySQL были созданы, в самое начало Ваших страничек поместите следующий 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 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-у (или любым другим способом):

$db = mysqli_connect ( «localhost» , «логин» , «пароль» , «имя_бд» );

$res = mysqli_query ( $db , «DELETE FROM black_list_ip WHERE date $res = mysqli_query ( $db , «DELETE FROM all_visits WHERE date

$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 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 адрес.

Источник

Бан по IP-адресу средствами PHP

Так уж сложилось у веб-мастеров, что на их сайты заходят как пользователи, так и спамерские роботы. Если первые заходят на сайт для поиска нужной информации, то вторым непременно подавай адреса e-mail’ов.

Так называемые флудеры, которым попросту от нечего делать или от небольшого интеллекта так и хочется завалить ваши новости, статьи бестолковой лексикой. Ну а форум сообщениями, явно не относящимися к тематике рассматриваемой темы.

Это неизбежно, как и то что за ночью приходит день и наоборот. Но с этим нужно бороться — иначе ваши порядочные пользователи вовсе потеряют интерес к вашему сайту — можете не сомневаться.

Самым простой метод противодействия данным явлениям — это банить таких посетителей по ip. Проще говоря, закрывать им доступ на ваш сайт. Данный метод пусть и не идеальная защита, но порядка 90% защиту он вам обеспечит. а это уже лучше, чем ничего.

Далее рассмотрим, как данная техника защиты работает на практике и как ее можно реализовать на php.

Для начала нам нужно получить список ip-адресов, которым будет закрыт доступ на наш сайт. Еще потребуется использовать массивы и циклы — вот где нам и пригодится php.

Для получения ip-адреса посетителя можно использовать суперглобальную переменную $_SERVER[‘REMOTE_ADDR’].

На php это реализуется следующим образом:

А теперь разберемся с остальными переменными нашего мини-скрипта. Создаем массив ($ban), куда помещаем все забаненые ip:

Как видите, ip нужно помещать в одинарные кавычки и отделять их друг от друга запятой (все просто и ясно — за что я и люблю php)

В следующая переменная ($count) будет занесено количество этих самых ip:

Для чего это все нужно — читайте дальше.

1) IP адрес определенного посетителя — переменная $ip;
2) массив запрещенных IP-адресов — $ban;
3) число элементов этого массива — $count.

Все элементарно просто — берем и сверяем адрес $ip со списком запрещенных — а так как у нас их может быть несколько, то для этого понадобится обход всего массива забаненых адресов.

Эту работу за нас легко проделает цикл for:

Вот и получается, что если проверяемый адрес совпадет с одним из наших «нехороших», то мы и дадим знать его обладателю — I’m sorry, you’ve been banned. 68.225.34.86.

А вот и весь скрипт целиком — это для тех, кому лень его собирать по частям из статьи:

Источник

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

Любой вебмастер рано или поздно сталкивается с проблемой защиты своего сайта от слишком частого обращения к его страничкам с какого-либо IP адреса. Хорошо, если в этот момент вебмастер находится у компьютера и может вручную забанить неугодный IP, с которого идет DDoS атака или скачивание сайта. Но что делать, если Вы находитесь далеко от компьютера? Ведь нельзя постоянно быть за монитором и отслеживать подобные ситуации.

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

Для работы нашего скрипта автобана необходима поддержка хостингом MySQL.

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

Структура данных таблиц приведена на скриншотах ниже:

Таблица, содержащая IP адрес посетителя и время посещения

Структура all_visits.

Таблица IP адресов, доступ которым на сайт запрещен

Структура black_list_ip.

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

После того, как таблицы в MySQL были созданы, в начало Ваших страничек поместите 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’ ))

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 . «‘)» );

$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 $htaccess_ip = mysql_fetch_array ( $result );
$lines_htaccess [] = «Deny from » . $htaccess_ip [ «ip» ]. «\r\n» ;
>

file_put_contents ( $file_htaccess , $lines_htaccess );
>
>
?>

Данный PHP код, при каждом обращении к страничке, сверяет по User-Agent поисковая система это или нет. Если это не поисковая система, помещает текущее время и IP адрес в таблицу all_visits.

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

Далее перезаписывается файл .htaccess, с уже добавленным только что заблокированным IP, тем самым запрещая ему доступ к сайту (подробнее о том, как заблокировать доступ к сайту по IP адресу).

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

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

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

Данный скрипт, пройдя серьезную доработку, работает и на нашем сайте, успешно запрещая доступ и защищая сайт от частого обращения.

P.S. С обновленной версией данного скрипта Вы можете ознакомиться в нашей новой теме — Временная блокировка доступа к сайту.

Источник

Читайте также:  Php ошибка базы данных
Оцените статью