Demon425
Постоялец
- Регистрация
- 9 Июл 2008
- Сообщения
- 472
- Реакции
- 120
- Автор темы
- #1
Всем известен хак Antioverload для DLE, вот он ...
Помимо того, что он делает, хотелось бы его модернизовать таким способом:
- во время выполнения, IP записывается в TXT-файл, каждый с новой строки в формате
192.168.0.1 | 6
192.168.0.2 | 7
где 6 и 7 - количество раз срабатывания защиты. Т.е. это был бы лог-файл;
- помимо файла что выше, есть ещё TXT-база, в которой содержатся чёрные IP, и который скрипт сам пополняет, путём: сверка есть ли в логе уже этот IP, если да - проверка сколько было раз срабатывания, если это число превышает указанное в конфигурации - занесение в список блокировки;
- дополнительный TXT-файл, в котором будет хранится база "зарезервированных" IP, т.е. чтоб для некоторых IP использовать другие значения $ad_delay и количества попыток доступа перед блокировкой (несколько юзеров на одном IP и т.п. задаётся админом);
- если IP не забанен - добавляется meta refresh на сайт, если нет, редирект на страничку с сообщением, что IP забанен, обращатся к админу (обычный html-файл);
- про админку уже не говорю ... было бы супер, если б лог можно было просмотреть/править через админпанель, как и список резервированных IP; путём считывания/редактирования TXT;
- TXT от внешнего просмотра можно закрыть посредством htaccess;
И главный вопрос реально ли это сделать ? думаю большинству ДЛешников это бы пригодилось ...
PHP:
<?php
/*
* Модуль antioverload
*/
/* Время задержки в секундах */
$ad_delay=0.5;
/* Путь к папке с временными файлами. Должен существовать */
$ad_DirName=$_SERVER['DOCUMENT_ROOT'].'/tmp';
/*
*---------------------------------------------------------
* Список поисковых роботов.
*---------------------------------------------------------
*/
$ad_Robots_UserAgent=array(
'aipbot',
'Aport',
'eStyleSearch',
'Gigabot',
'Gokubot',
'Google',
'MJ12bot',
'msnbot',
'PlantyNet_WebRobot',
'StackRambler',
'TurtleScanner',
'Yahoo',
'Yandex',
'YaDirectBot',
);
/*
*----------------------------------------------------------
* Функция создаёт в указанной директории файл, начинающийся
* с буквы a (для отличия от других возможных файлов) и
* содержащий в имени ip-адрес клиента.
*----------------------------------------------------------
*/
function ad_WiteIP($dir){
$f=fopen($dir.'/a'.$_SERVER['REMOTE_ADDR'], 'w');
fclose($f);
}
/*
*----------------------------------------------------------
* Проверка на наличие в поле HTTP_USER_AGENT чего-нибудь из
* вышенаписанного списка.
*----------------------------------------------------------
*/
$ad_IsRobot=false;
foreach ($ad_Robots_UserAgent as $match){
if (strstr($_SERVER['HTTP_USER_AGENT'], $match)){
$ad_IsRobot=true;
break;
}
}
/*
*---------------------------------------------------------
* Поисковые роботы не любят, когда к адресу страницы
* добавляется переменная сессии. Поэтому, если на сайте
* используются сессии, то их лучше включать, если агент -
* не робот.
* Если сессии не используются, то этот кусок можно убрать.
*---------------------------------------------------------
*/
if (!$ad_IsRobot){
session_start();
}
if (!$ad_IsRobot){
/*** Чтение каталога и удаление старых файлов ***/
$ad_dir =opendir($ad_DirName)
or die('Отсутствует директория для временных файлов');
$ad_now =time();
$ad_forbid =$ad_now-$ad_delay;
/* IP-адрес в имени файла, начинающегося на букву a,
а время обращения - время изменения файла */
while (false!==($ad_FName=readdir($ad_dir))){
if (ereg('^a[1-9]',$ad_FName)
&& (@ filemtime($ad_DirName.'/'.$ad_FName)<$ad_forbid)){
@ unlink($ad_DirName.'/'.$ad_FName);
}
}
closedir($ad_dir);
/*** Проверка на существование пометки
о недавнем обращении с данного ip-адреса ***/
if (file_exists($ad_DirName.'/a'.$_SERVER['REMOTE_ADDR'])){
/* Если обращение было недавно, то выводим сообщение об ошибке */
header('HTTP/1.0 503 Service Unavailable');
header('Status: 503 Service Unavailable');
header('Retry-After: '.$ad_delay*3);
?>
<!doctype html public "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Error 503 [Service Temporary Unavailible]</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
<META HTTP-EQUIV="Refresh" Content="5; URL= http://XXX.XXX.XXX.XXX">
</head>
<body bgcolor="#A5C77A">
<center>
<h2>Превышен лимит подключений</h2>
<br>
<br>
<p>Вы превысили лимит подключений.<br>
Станица будет обновлена автоматически.
</p>
</center>
</body>
</html>
<?php
ad_WiteIP($ad_DirName); // Перед выходом записываем ip
exit;
}else{
ad_WiteIP($ad_DirName);
}
}
?>
Помимо того, что он делает, хотелось бы его модернизовать таким способом:
- во время выполнения, IP записывается в TXT-файл, каждый с новой строки в формате
192.168.0.1 | 6
192.168.0.2 | 7
где 6 и 7 - количество раз срабатывания защиты. Т.е. это был бы лог-файл;
- помимо файла что выше, есть ещё TXT-база, в которой содержатся чёрные IP, и который скрипт сам пополняет, путём: сверка есть ли в логе уже этот IP, если да - проверка сколько было раз срабатывания, если это число превышает указанное в конфигурации - занесение в список блокировки;
- дополнительный TXT-файл, в котором будет хранится база "зарезервированных" IP, т.е. чтоб для некоторых IP использовать другие значения $ad_delay и количества попыток доступа перед блокировкой (несколько юзеров на одном IP и т.п. задаётся админом);
- если IP не забанен - добавляется meta refresh на сайт, если нет, редирект на страничку с сообщением, что IP забанен, обращатся к админу (обычный html-файл);
- про админку уже не говорю ... было бы супер, если б лог можно было просмотреть/править через админпанель, как и список резервированных IP; путём считывания/редактирования TXT;
- TXT от внешнего просмотра можно закрыть посредством htaccess;
И главный вопрос реально ли это сделать ? думаю большинству ДЛешников это бы пригодилось ...