[PHP] Автоматическая блокировка ботов - сканеров вашего сайта (микростатья)

Discussion in 'PHP' started by Kamik, 12 Apr 2016.

  1. Kamik

    Kamik Member

    Joined:
    2 Dec 2008
    Messages:
    122
    Likes Received:
    85
    Reputations:
    8
    1. Введение

    Наверняка многие из Вас, кто администрирует свой сайт сталкивались с проблемой большого количества ботов, что пытаются просканировать Ваш ресурс на наличие определенных админок от популярных CMS (Wordpress, Joomla и другие). В логах апача это выглядит приблизительно вот так:
    Code:
    %ВАШ ХОСТ%: %IP АТАКУЮЩЕГО% [12/Apr/2016:03:57:31 +1000] "GET /wp-login.php HTTP/1.0" 302 228 "-" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0"
    %ВАШ ХОСТ%: %IP АТАКУЮЩЕГО% [12/Apr/2016:03:57:37 +1000] "GET /wp-admin/ HTTP/1.0" 302 218 "-" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0"
    

    Данные товарищи-боты, откровенно говоря, особо то и не надоедают, но доставляют неудобства, связанные с чтением логов, ибо они растут как грибы после дождя. В общем, будем бороться!

    2. Суть

    Идея блокировки хороша, но вот как? Тут нам в помощь приходит файлик .htaccess -
    посредством него мы и будем производить блокировку. Для этого я написал небольшой простенький скрипт на PHP:
    PHP:
    <?

    $enable="1"//включена ли блокировка. Значение 1 - да 
    $loging="1";  //включено ли логирование. Значение 1 - да
    $messaging="1"//выводить ли 404 ошибку заблокированному. Значение 1 - да

    //настройки блокировки
    $ban=htmlspecialcharshtmlentitiestrim($_SERVER['REMOTE_ADDR']) , ENT_QUOTES ) ); //Определяем IP адрес атакующего.
    $file ".htaccess"//имя файла в котором производим блокировку 
    $path ""//относительный путь к файлу $file. Слеш "/" в конце обязателен!
    $ban_string ="deny from ".$ban//строка блокировки

    //Настройки логирования
    $log_file "ban_log.txt"//файл лога блокировок
    $date=date('d-m-Y H:i:s'); //определение даты
    $address=$_SERVER['REQUEST_METHOD']." ".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; //строка запроса
    $log_string ="$date - $ban заблокирован при попытке доступа. Запрос - $address"//текст лога

    //рабочая часть скрипта
    if ($enable=="1") {                         //соответственно сама блокировка
        
    $filepath $path.$file;
        
    $killer fopen ($filepath'a+'); 
        
    fwrite ($killer$ban_string."\r\n"); 
        
    fclose ($killer); 
    }

    if (
    $loging=="1") {                            //логирование
        
    $filepath $path.$log_file;
        
    $log fopen ($filepath'a+'); 
        
    fwrite ($log$log_string."\r\n"); 
        
    fclose ($log); 
    }

    if (
    $messaging=="1") {                    //вывод сообщения заблокированному
    header('HTTP/1.0 404 Not Found'); 
    }

    ?>
    Соответственно, файлу .htaccess нужно выставить права на запись и вписать в него в самом низу 2 строчки (!!!)ОБЯЗАТЕЛЬНО(!!!) не забыв поставить перенос строки в самом конце.
    Code:
    order allow,deny
    allow from all
    
    
    Данный скрипт обзываем теми именами файлов (на забываем создавать еще и папки и настраивать сам скрипт), по которым чаще всего идет сканирование и подставляем их "ловушкой" для ботов. Мой список URL таков:
    Code:
    /administrator/index.php
    /administrator/admin.php
    /admin/index.php
    /admin/admin.php
    /wp-admin/index.php
    admin.php
    administrator.php
    wp-login.php
    
    3. Заключение

    Да, ГУРУ PHP - можете ругать меня за быдлокод, говорить что "так нельзя", указывать на ошибки...но...он работает!
    За неделю работы данных ловушек на моем сайте было заблокировано 163 различных IP адреса. Выводы делайте сами.
    Спасибо всем за внимание!
     
  2. c1rex

    c1rex Member

    Joined:
    18 Aug 2015
    Messages:
    74
    Likes Received:
    30
    Reputations:
    0
    Вот за комменты твои оранжевые, никогда не прощу.
     
  3. Kamik

    Kamik Member

    Joined:
    2 Dec 2008
    Messages:
    122
    Likes Received:
    85
    Reputations:
    8
    а это ачат так в тегах PHP форматирует

    Да и скрипт писал для себя на работе, чтоб даже идиот в случае чего в нем разобрался.
    У меня на работе просто админов много, но никто ничего не пишет. Вот и пришлось раскидывать все "на пальцах" и "для тупых"
     
  4. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    1. Хороша ли идея блочить по IP?
    2. Хороша ли идея веб-серверу возможность редактировать .htaccess?

    В данном виде урлы админок проще в сам .htaccess добавить и перенаправлять на единичный экземпляр скрипта, чем распихивать его по папкам.
     
  5. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    зачем столько костылей, в директорию с админкой кладется .htaccess с http basic авторизацией
    в основной .htaccess добавляется код
    Code:
    RewriteEngine On
    RewriteRule ^admin/index.php|admin.php$ - [F]
    
     
    _________________________
  6. Kamik

    Kamik Member

    Joined:
    2 Dec 2008
    Messages:
    122
    Likes Received:
    85
    Reputations:
    8
    Тут согласен. Как-то не подумал в этом моменте. Надо будет реализовать =)
    По п.1 - тут вопрос спорный. С одной стороны - через пару - тройку недель большое количество IP будут заблочены. С другой стороны - а почему бы и нет?
    По п.2 - тут да. Не самый лучший вариант конечно. Но в результате мы получаем перманентную блокировку. Конечно, если не хочется давать такой доступ - можно отключить в скрипте саму блокировку и блочить ручками основываясь на логах, но мне как-то хотелось автоматизировать процесс, ведь именно ради этого скрипт и писался.