Создать ответ 
Немного измененный скрипт автобана
Автор Сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #51
RE: Немного измененный скрипт автобана
Привожу полный код + где то видел блокировку по рефереру, но так и не нашел.

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(localhost,san***,***) or die("Could not connect: ".mysql_error());
mysql_select_db("san***"$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,date) VALUES ('".$ip."','".date("Y-m-d")."')");

  
$file_htaccess=".htaccess";
  
$start_line=0;

    
$lines=file($file_htaccess);
    for (
$n=0$n<=count($lines); $n++) if ($lines[$n] == "<Limit GET POST> \r\n"$start_line=$n;
    if (
$start_line!=0) for ($n=0$n<$start_line$n++) $lines_htaccess[]=$lines[$n];
        else 
$lines_htaccess=$lines
  echo 
"<br>";
  
$lines_htaccess[]="Order Allow,Deny\r\n";
  
$lines_htaccess[]="Allow from all\r\n";

  
$result=mysql_query("SELECT ip,date 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);
   
$new_date explode('-',$htaccess_ip[date]);

if (
date("Y-m-d")<date("Y-m-d"mktime(000    $new_date[1], $new_date[2]+1$new_date[0])))$lines_htaccess[]=" deny from ".$htaccess_ip[ip]."\r\n";
  }

  
file_put_contents($file_htaccess$lines_htaccess);
 }

10.10.2013 08:12:36
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #52
RE: Немного измененный скрипт автобана
Понятно.
Кстати, зачем в коде нужна строчка echo "<br>";??? Лучше удалите, она явно лишняя.

Т.к. статью давно не обновлял, то рекомендую ip определять при помощи $_SERVER['REMOTE_ADDR'].
Т.е. вместо
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']; 

Использовать просто $bot=$_SERVER['REMOTE_ADDR'];


Итак, для начала нужно изменить тип поля, хранящего дату в таблице black_list_ip на int, т.к. дату мы будем записывать в формате Unixtime (т.к. нам понадобятся секунды и минуты).

Далее нужно фиксировать дату бана в формате Unixtime. Для этого строчки:
PHP код:
if ($count_visit[0]>10) {
 
$result=mysql_query("INSERT INTO black_list_ip (ip,date) VALUES ('".$ip."','".date("Y-m-d")."')"); 

необходимо заменить на:
PHP код:
if ($count_visit[0]>10) {
 
$result=mysql_query("INSERT INTO black_list_ip (ip,date) VALUES ('".$ip."','".time(true)."')"); 


Теперь по поводу 15 минут. Замените строчки:
PHP код:
$new_date explode('-',$htaccess_ip[date]);

if (
date("Y-m-d")<date("Y-m-d"mktime(000    $new_date[1], $new_date[2]+1$new_date[0])))$lines_htaccess[]=" deny from ".$htaccess_ip[ip]."\r\n"

на одну такую:
PHP код:
if (time(true)<($htaccess_ip[date]+900))$lines_htaccess[]=" deny from ".$htaccess_ip[ip]."\r\n"

А теперь интереснее, если Ваш сайт поддерживает CRON, то нужно, например, раз в пять минут удалять забаненные IP адреса из таблицы black_list_ip и перезаписывать .htaccess.

Если CRON-а нет, то придется делать финт ушами. Big Grin

Так же, советуем при работе с файлом .htaccess использовать принудительные блокировки от записи (http://usefulscript.ru/file_locking.php), т.к. если произойдет сбой при перезаписи .htaccess, то сайт "ляжет".
10.10.2013 21:09:21
Найти все сообщения Цитировать это сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #53
RE: Немного измененный скрипт автобана
Спасибо за ответ, что-то отбойника не было на почте об ответе, буду завтра пробовать. <br> для того чтобы при перезаписи хтаксеса не вписывалось все в одну строку.
13.10.2013 21:50:06
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #54
RE: Немного измененный скрипт автобана
Но у Вас же echo "<br>"; - значит, Вы выводите на экран данный тег, а не в .htaccess. Тем более, внутри .htaccess для разрыва строки используются совсем другие методы - \r\n.
13.10.2013 22:39:58
Найти все сообщения Цитировать это сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #55
RE: Немного измененный скрипт автобана
Да вы правы, поправлю, вопрос по поводу крона, какой файл то нужно запускать, чтобы перезаписывать? + как можно рефереров банить? Ну, к примеру, пришли с какого либо определенного сайта?
14.10.2013 13:25:10
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #56
RE: Немного измененный скрипт автобана
Создайте новый файл, в который вставьте код, который у Вас получился со строчки $file_htaccess=".htaccess"; и до окончания записи в .htaccess. Если Вы не используете принудительные блокировки, то это будет строчка file_put_contents($file_htaccess, $lines_htaccess);

Так же не забудьте сначала подключиться к БД.

О том, как банить по User-Agent у нас уже существует тема - Как заблокировать доступ к сайту по User-Agent. Не думаю что у Вас очень много нежелательных User-Agent, так что просто добавьте их все в конец скрипта автобана (перед file_put_contents...), как сказано в той теме, и у Вас получится что-то вроде этого:

Код:
$lines_htaccess[]="SetEnvIfNoCase User-Agent \"Java/1.6.0_04\" bad_bot\r\n";
$lines_htaccess[]="SetEnvIfNoCase User-Agent \"Downloader\" bad_bot\r\n";

$lines_htaccess[]="<Limit GET POST HEAD>\r\n";
$lines_htaccess[]=" Order Allow,Deny\r\n";
$lines_htaccess[]=" Allow from all\r\n";
$lines_htaccess[]=" Deny from env=bad_bot\r\n";
$lines_htaccess[]="</Limit>\r\n";
14.10.2013 18:56:53
Найти все сообщения Цитировать это сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #57
RE: Немного измененный скрипт автобана
Спасибо, как протестирую отпишусь.
15.10.2013 20:38:47
Найти все сообщения Цитировать это сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #58
RE: Немного измененный скрипт автобана
Изменил то, что требуется, теперь вообще не банит, странно как то, сканер нормально гуляет по сайту.
17.10.2013 12:20:03
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #59
RE: Немного измененный скрипт автобана
Выложите скрипт, который у Вас получился после всех изменений. Так же следует уточнить, что у Вам записывается в БД и в .htaccess (или не записывается вовсе).
17.10.2013 18:26:45
Найти все сообщения Цитировать это сообщение
sanitarn Не на форуме
Ефрейтор
*

Сообщений: 12
У нас с: Oct 2013
Сообщение: #60
RE: Немного измененный скрипт автобана
По всей видимости в Базу и хтаксес ничего не записывается, изменил как вы и писали у таблицы date значение на INT + изменил данные в скрипте:

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

$link=mysql_connect(localhost,***,***) 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,date) VALUES ('".$ip."','".time(true)."')"); 

  
$file_htaccess=".htaccess";
  
$start_line=0;

    
$lines=file($file_htaccess);
    for (
$n=0$n<=count($lines); $n++) if ($lines[$n] == "<Limit GET POST> \r\n"$start_line=$n;
    if (
$start_line!=0) for ($n=0$n<$start_line$n++) $lines_htaccess[]=$lines[$n];
        else 
$lines_htaccess=$lines
  
  
$lines_htaccess[]="\r\n";
  
$lines_htaccess[]="Order Allow,Deny\r\n";
  
$lines_htaccess[]="Allow from all\r\n";

  
$result=mysql_query("SELECT ip,date 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);
if (
time(true)<($htaccess_ip[date]+900))$lines_htaccess[]=" deny from ".$htaccess_ip[ip]."\r\n"
  }

  
file_put_contents($file_htaccess$lines_htaccess);
 }

(Последний раз сообщение было отредактировано 17.10.2013 в 23:30:34, отредактировал пользователь sanitarn.)
17.10.2013 22:54:23
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)


LiveInternet
© Copyright 2011-2024 by UsefulScript.ru