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=htmlspecialchars( htmlentities( trim($_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 адреса. Выводы делайте сами. Спасибо всем за внимание!
а это ачат так в тегах PHP форматирует Да и скрипт писал для себя на работе, чтоб даже идиот в случае чего в нем разобрался. У меня на работе просто админов много, но никто ничего не пишет. Вот и пришлось раскидывать все "на пальцах" и "для тупых"
1. Хороша ли идея блочить по IP? 2. Хороша ли идея веб-серверу возможность редактировать .htaccess? В данном виде урлы админок проще в сам .htaccess добавить и перенаправлять на единичный экземпляр скрипта, чем распихивать его по папкам.
зачем столько костылей, в директорию с админкой кладется .htaccess с http basic авторизацией в основной .htaccess добавляется код Code: RewriteEngine On RewriteRule ^admin/index.php|admin.php$ - [F]
Тут согласен. Как-то не подумал в этом моменте. Надо будет реализовать =) По п.1 - тут вопрос спорный. С одной стороны - через пару - тройку недель большое количество IP будут заблочены. С другой стороны - а почему бы и нет? По п.2 - тут да. Не самый лучший вариант конечно. Но в результате мы получаем перманентную блокировку. Конечно, если не хочется давать такой доступ - можно отключить в скрипте саму блокировку и блочить ручками основываясь на логах, но мне как-то хотелось автоматизировать процесс, ведь именно ради этого скрипт и писался.