Услуга Нужен anti-ddos )

  • Автор темы Rubrika
  • Дата начала
Rubrika
Участник
Сообщения
342
Реакции
43
Всем привет, так уж случилось, что на сайт мониторинг организовал ддос-атаку (что за история-расскажу позже). Но смысл в том, что сайт лег, пробовал подключить скрипты от маленького ддоса (а ддос реально мелкий) - ни один не хочет работать ) Пробовал подключить 4 разных скрипта.
Как их подключить?)
Я делал так:
В корневой index.php после:
<?PHP
Добавил:
include('anti_ddos/index.php');
т.е. по логике он должен подгружаться самым первым из всего скрипта.
НО в папке anti_ddos, где лежат нужные файлы этого модуля, есть текстовые файлы, куда должны записыватья IP-шники ботов и людей + общие IP. Но все файлы пустые, кроме check.txt . В нем находится одна строчка: <?php $ad_num_query=3; $ad_sec_query=57; ?>

Уже пробовал менять права на файлы, ставил на скриптах - выполнить, на текстовые - права на запись, толку нет. Как нормально подключить или настроить Anti-DDos модуль?)
 
MrMatnoos
Участник
Сообщения
198
Реакции
41
Skype
Rubrika написал(а):
Всем привет, так уж случилось, что на сайт мониторинг организовал ддос-атаку (что за история-расскажу позже). Но смысл в том, что сайт лег, пробовал подключить скрипты от маленького ддоса (а ддос реально мелкий) - ни один не хочет работать ) Пробовал подключить 4 разных скрипта.
Как их подключить?)
Я делал так:
В корневой index.php после:
<?PHP
Добавил:
include('anti_ddos/index.php');
т.е. по логике он должен подгружаться самым первым из всего скрипта.
НО в папке anti_ddos, где лежат нужные файлы этого модуля, есть текстовые файлы, куда должны записыватья IP-шники ботов и людей + общие IP. Но все файлы пустые, кроме check.txt . В нем находится одна строчка: <?php $ad_num_query=3; $ad_sec_query=57; ?>

Уже пробовал менять права на файлы, ставил на скриптах - выполнить, на текстовые - права на запись, толку нет. Как нормально подключить или настроить Anti-DDos модуль?)
Держи
 
MrMatnoos
Участник
Сообщения
198
Реакции
41
Skype
Rubrika написал(а):
Всем привет, так уж случилось, что на сайт мониторинг организовал ддос-атаку (что за история-расскажу позже). Но смысл в том, что сайт лег, пробовал подключить скрипты от маленького ддоса (а ддос реально мелкий) - ни один не хочет работать ) Пробовал подключить 4 разных скрипта.
Как их подключить?)
Я делал так:
В корневой index.php после:
<?PHP
Добавил:
include('anti_ddos/index.php');
т.е. по логике он должен подгружаться самым первым из всего скрипта.
НО в папке anti_ddos, где лежат нужные файлы этого модуля, есть текстовые файлы, куда должны записыватья IP-шники ботов и людей + общие IP. Но все файлы пустые, кроме check.txt . В нем находится одна строчка: <?php $ad_num_query=3; $ad_sec_query=57; ?>

Уже пробовал менять права на файлы, ставил на скриптах - выполнить, на текстовые - права на запись, толку нет. Как нормально подключить или настроить Anti-DDos модуль?)
Rubrika написал(а):
Это не анти-ддос.. Это защита от скуль-атак и xss ...
Скинь содержание папки anti_ddos, может у тебя там в файлах ошибка.
 
Rubrika
Участник
Сообщения
342
Реакции
43
Mrmatnoos написал(а):
Скинь содержание папки anti_ddos, может у тебя там в файлах ошибка.
не может быть ошибка сразу в 4-х разных версия анти-ддоса.
 
MrMatnoos
Участник
Сообщения
198
Реакции
41
Skype
Rubrika написал(а):
не может быть ошибка сразу в 4-х разных версия анти-ддоса.
у меня тоже эта защита стоит и работает.
 
Rubrika
Участник
Сообщения
342
Реакции
43
Mrmatnoos написал(а):
у меня тоже эта защита стоит и работает.
1) С чего ты взял, что она работает? Как проверял?
2) Поищи в инете разницу между SQL-ijection и DDos-атакой. И ВОЗМОЖНО, подчеркну, возможно поймешь, что это совершенно РАЗНЫЕ вещи.
 
The Doshs
Участник
Сообщения
383
Реакции
63
Хочет бесплатный Ani_Ddos:sneaky:
 
Rubrika
Участник
Сообщения
342
Реакции
43
The Doshs написал(а):
Хочет бесплатный Ani_Ddos:sneaky:
да я на форуме уже несколько штук нашел, причем таких же как и у меня ) Либо с моего сборника слили, либо тоже как я - нашли в интернете ))
 
MrMatnoos
Участник
Сообщения
198
Реакции
41
Skype
  • #10
Rubrika написал(а):
1) С чего ты взял, что она работает? Как проверял?
2) Поищи в инете разницу между SQL-ijection и DDos-атакой. И ВОЗМОЖНО, подчеркну, возможно поймешь, что это совершенно РАЗНЫЕ вещи.
Да нет у меня стоит защита include('anti_ddos/index.php'); и работает (сам доссил свой сайт и попадал на стр. защиты от досса).
 
Rubrika
Участник
Сообщения
342
Реакции
43
  • #11
Mrmatnoos написал(а):
Да нет у меня стоит защита include('anti_ddos/index.php'); и работает (сам доссил свой сайт и попадал на стр. защиты от досса).
каким образом ты ддосил ?
Какие страницы были? Записывался ли IP ??
 
The Doshs
Участник
Сообщения
383
Реакции
63
  • #12
Поделись тогда:help:.
 
MrMatnoos
Участник
Сообщения
198
Реакции
41
Skype
  • #13
Rubrika написал(а):
каким образом ты ддосил ?
Какие страницы были? Записывался ли IP ??
ддосил страницу фермы и главную, ддосил с помощью хакерской программы ддоса сайтов(в нете нашёл), ip настроить не успел (думаю если ты в php разберешься то сам сможешь настроить)
скрин из проги
 
Rubrika
Участник
Сообщения
342
Реакции
43
  • #14
Mrmatnoos написал(а):
ддосил страницу фермы и главную, ддосил с помощью хакерской программы ддоса сайтов(в нете нашёл), ip настроить не успел (думаю если ты в php разберешься то сам сможешь настроить)
скрин из проги
ахахах, не приходило в голову, что неудача - не отправил пакет ) Попробуй любой другой сайт поддосить с этой проги )) И скинь скрин )
Да и ддосить 1 человеком - ничего не проверишь )
 
The Doshs
Участник
Сообщения
383
Реакции
63
  • #15
Rubrika,как я вижу вы исправили Anti_Ddos.Не могли вы поделиться,как вы его исправили?Может кому-нибудь понадобится,пригодится.
 
Rubrika
Участник
Сообщения
342
Реакции
43
  • #16
The Doshs написал(а):
Rubrika,как я вижу вы исправили Anti_Ddos.Не могли вы поделиться,как вы его исправили?Может кому-нибудь понадобится,пригодится.
CloudFlare подключил. Нормальных скриптов по анти-ддосу не нашел. Все с ошибками.
 
google
Участник
Сообщения
66
Реакции
3
  • #17
Если ддос действительно слабенький, можно попробовать использовать PHP скрипты, но они будут загружать сервер и годятся только как временное решение проблемы.
Скрипт нужно инклюдить в исполняемый файл, в index.php, например.

Создаем файл, допустим, antiddos.php, туда копируем любой код из нижеприведенных, затем в файле index.php пишем вверху:

include("antiddos.php");

exit; // нужно дать скрипту побанить ботов некоторое время, а потом можно закомментировать exit.


Кто-нибудь может прокомментировать данные по ддос файлам?



Код:
<?php
class antiDdos
{
    // дебаг
    public $debug = false;
    // директория для хранения файлов индефикации запросов
    public $dir = '_bots/';
    // номер icq администратора
    public $icq = '123456';
    // сообщение при выключенном сайте
    public $off_message = 'Временные неполадки, пожалуйста, подождите.';
    // индивидуальный индефикатор
    private $indeficator = null;
    // сообщение при бане, работают шаблоны, можно использовать - {ICQ}, {IP}, {UA}, {DATE}
    public $ban_message = 'Вы были заблокированы antiddos системой.
                          Если это ошибка обратитесь к администратору, icq of admin: {ICQ}
                          <hr>(c)XakNet antiddos module, ваш IP - {IP}(<i>{UA}</i>), date - {DATE}';
    // команда выполнения бана в файрволле
    public $exec_ban = 'iptables -A INPUT -s {IP} -j DROP';
    // тип защиты от ддоса:
    /* Возможные значения $ddos 1-5:
    | 1. Простая проверка по кукам, по умолчанию(рекомендую)  
    | 2. Двойная проверка через $_GET antiddos и meta refresh  
    | 3. Запрос на авторизацию WWW-Authenticate  
    | 4. полное отключение сайта, боты не блокируются!!!  
    | 5. выключать сайт если нагрузка слишком большая на сервере, боты не блокируются!!!  
    */
    var $ddos = 1;
    // часть домена поисковых ботов, см strpos()
    private $searchbots = array('googlebot.com', 'yandex.ru', 'ramtel.ru', 'rambler.ru', 'aport.ru', 'sape.ru', 'msn.com', 'yahoo.net');
    // временная переменные нужные для работы скрипта
    private $attack = false;
    private $is_bot = false;
    private $ddosuser;
    private $ddospass;
    private $load;
    public $maxload = 80;
  
    function __construct($debug)
    {
        @session_start() or die('session_start() filed!');
        $this->indeficator = md5(sha1('botik' . strrev(getenv('HTTP_USER_AGENT'))));
        $this->ban_message = str_replace(array('{ICQ}', '{IP}', '{UA}', '{DATE}'),
                                        array($this->icq, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'], date('d.m.y H:i')),
                                        $this->ban_message
                                        );
        if (eregi(ip2long($_SERVER['REMOTE_ADDR']), file_get_contents($this->dir . 'banned_ips')))
            die($this->ban_message);
        $this->exec_ban = str_replace('{IP}', $_SERVER['REMOTE_ADDR'], $this->exec_ban);
        $this->debug = $debug;
        if(!function_exists('sys_getloadavg'))
        {
            function sys_getloadavg()
            {
                return array(0,0,0);
            }
        }
        $this->load = sys_getloadavg();
        if(!$this->sbots())
        {
            $this->attack = true;
            $f = fopen($this->dir . ip2long($_SERVER["REMOTE_ADDR"]), "a");
            fwrite($f, "query\n");
            fclose($f);
        }
    }
  
    /**
    * Старт работы антиддоса
    **/
    function start()
    {
        if($this->attack == false)
            return;
        switch($this->ddos)
        {
            case 1:
                $this->addos1();
                break;
            case 2:
                $this->addos2();
                break;
            case 3:
                $this->ddosuser = substr(ip2long($_SERVER['REMOTE_ADDR']), 0, 4);
                $this->ddospass = substr(ip2long($_SERVER['REMOTE_ADDR']), 4, strlen(ip2long($_SERVER['REMOTE_ADDR'])));
                $this->addos3();
                break;
            case 4:
                die($this->off_message);
                break;
            case 5:
                if ($this->load[0] > $this->maxload)
                {
                    header('HTTP/1.1 503 Too busy, try again later');
                    die('<center><h1>503 Server too busy.</h1></center><hr><small><i>Server too busy. Please try again later. Apache server on ' . $_SERVER['HTTP_HOST'] . ' at port 80 with <a href="http://forum.xaknet.ru/">ddos protect</a></i></small>');
                }
                break;
            default:
                break;
        }
        if ($_COOKIE['ddos'] == $this->indeficator)
            @unlink($this->dir . ip2long($_SERVER["REMOTE_ADDR"]));
    }
  
    /**
    * Функция проверяет не является ли клиент поисковым ботом
    **/
    function sbots()
    {
        $tmp = array();
        foreach($this->searchbots as $bot)
        {
            $tmp[] = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), $bot) !== false;
            if($tmp[count($tmp) - 1] == true)
            {
                $this->is_bot = true;
                break;
            }
        }
        return $this->is_bot;
    }
  
    /**
    * Функция бана
    **/
    private function ban()
    {
        if (! system($this->exec_ban))
        {
            $f = fopen($this->dir . 'banned_ips', "a");
            fwrite($f, ip2long($_SERVER['REMOTE_ADDR']) . '|');
            fclose($f);
        }
        die($this->ban_message);
    }
    /**
    * Первый тип защиты
    **/
    function addos1()
    {
        if (empty($_COOKIE['ddos']) or !isset($_COOKIE['ddos']))
        {
            $counter = @file($this->dir . ip2long($_SERVER["REMOTE_ADDR"]));
            setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356); // ставим куки на год.
            if (count($counter) > 10) {
                if (! $this->debug)
                    $this->ban();
                else
                    die("Блокированы.");
            }
            if (! $_COOKIE['ddos_log'] == '1')
            {
                if (! $_GET['antiddos'] == 1)
                {
                    setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //чтоб не перекидывало постоянно рефрешем.
                    if(headers_sent())
                        die('Header already sended, check it, line '.__LINE__);
                    header("Location: ./?antiddos=1");
                }
            }
        } elseif ($_COOKIE['ddos'] !== $this->indeficator)
        {
            if (! $this->debug)
                $this->ban();
            else
                die("Блокированы.");
        }
    }
  
    /**
    * Второй тип защиты
    **/
    function addos2()
    {
        if (empty($_COOKIE['ddos']) or $_COOKIE['ddos'] !== $this->indeficator)
        {
            if (empty($_GET['antiddos']))
            {
                if (! $_COOKIE['ddos_log'] == '1')
                    //проверям есть ли запись в куках что был запрос
                    die('<meta http-equiv="refresh" content="0;URL=?antiddos=' . $this->indeficator . '" />');
            } elseif ($_GET['antiddos'] == $this->indeficator)
            {
                setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356);
                setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем.
            }
            else
            {
                if (!$this->debug)
                    $this->ban();
                else
                {
                    echo "May be shall not transform address line?";
                    die("Блокированы.");
                }
            }
        }
    }
  
    /**
    * Третий тип защиты
    **/
    function addos3()
    {
        if (! isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== $this->ddosuser || $_SERVER['PHP_AUTH_PW'] !== $this->ddospass)
        {
            header('WWW-Authenticate: Basic realm="Vvedite parol\':  ' . $this->ddospass . ' | Login: ' . $this->ddosuser . '"');
            header('HTTP/1.0 401 Unauthorized');
            if (! $this->debug)
                $this->ban();
            else
                die("Блокированы.");
            die("<h1>401 Unauthorized</h1>");
        }
    }
}
/*
// Exmaple
$ad = new antiDdos(false);
$ad->dir = 'bots/';
$ad->ddos = 2;
$ad->start();
*/
?>


Код:
[CODE]<?php
/*
*--------------------------------------------------------
* Модуль antioverload
*--------------------------------------------------------
* Модуль предназначен для ограничения доступа к сайту или
* к страницам, где он включён.
* Принцип работы в том, что запоминается ip-адрес и время
* обращения с этого адреса. И если в течение заданного
* времени происходит обращение с того же адреса, то ему
* выдаётся ошибка 503.
* Модуль необходимо подключать к скрипту самым первым.
* Этим обеспечивается быстрота его работы.
*--------------------------------------------------------
*/
/* Время задержки в секундах */
$ad_delay=2;
/* Путь к папке с временными файлами. Должен существовать */
$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',
);
/*
*---------------------------------------------------------
* Список доверенных IP.
*---------------------------------------------------------
*/
$ad_good_ip = array(
    '217.107.36.73',
);
/*
*----------------------------------------------------------
* Функция создаёт в указанной директории файл, начинающийся
* с буквы 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( in_array($_SERVER['REMOTE_ADDR'], $ad_good_ip) ) {
    $good_ip = true;
} else {
    $good_ip = false;
}
/*
*---------------------------------------------------------
* Поисковые роботы не любят, когда к адресу страницы
* добавляется переменная сессии. Поэтому, если на сайте
* используются сессии, то их лучше включать, если агент -
* не робот.
* Если сессии не используются, то этот кусок можно убрать.
*---------------------------------------------------------
*/
if (!$ad_IsRobot AND !$good_ip){
  session_start();
}
if (!$ad_IsRobot AND !$good_ip){
  /*** Чтение каталога и удаление старых файлов ***/
  $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>Ошибка 503</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
</head>
<body>
<h1>Ошибка 503 (Service Unavailable)</h1>
<p>Сервер не может в данный момент выдать запрашиваемую Вами страницу.
Попробуйте вызвать эту страницу позже (клавиша F5).</p>
</body>
</html>
<?php
      ad_WiteIP($ad_DirName);  // Перед выходом записываем ip
      exit;
  }else{
      ad_WiteIP($ad_DirName);
  }
}
?>
<?php
#(c) Boolean.
#####################################################################################
#####################################################################################
#####################################################################################
#####################################################################################
$config['time'] = 2;
#Время обращения к скрипту, после которого будет(возможно) выдан бан.
$config['countaban'] = 5;
#количество возможных нарушений времени обращения, такая возможность введена для более детально точного отделения пользователей от атакующих ботов.
$config['directory'] = '_temp';
#временна директория, должна существовать, и иметь права на запись.
$config['checkmask'] = 'check';
#маска для проверки, не стоит трогать.
$config['banmask'] = 'ban';
#маска для бана, не стоит трогать.
#Комманды после нарушения времени и кол-ва обращений. Используйте константу [IP] - IP Бота.
$config['commands'][] = 'iptables -A ISPMGR -s [IP] -j DROP';
$config['commands'][] = 'iptables -I INPUT -s [IP] -j DROP';
#Доверенные IP.
$config['white']['ip'] = @file('whiteips.txt');
#Доверенные ЮзерАгенты.
$config['white']['useragent'][] = 'Google bot';
$config['white']['useragent'][] = 'Yasha bot';
#Сообщение для пользователя. HTML Работает.
$config['message'] = file_get_contents("ddosmessage.html");
#####################################################################################
#####################################################################################
#####################################################################################
#####################################################################################
$ip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
if ( ! is_dir($config['directory']) )
exit("Temp directory not found.");
if ( ! is_writable($config['directory']) )
exit("Temp directory is not writable.");
if ( @in_array($ip,$config['white']['ip']) || @in_array($useragent,$config['white']['useragent']) )
$white = true;
if ( ! $white ){

if ( file_exists( $config['directory'] . "/" . $config['checkmask'] . $ip ) ){

$time = filemtime($config['directory'] . "/" . $config['checkmask'] . $ip);
$f=fopen( $config['directory'] . "/" . $config['checkmask'] . $ip , 'w' );
fclose($f);

if ($time >= time() - $config['time']){

if (file_exists($config['directory'] . "/" . $config['banmask'] . $ip)){

$count = file_get_contents($config['directory'] . "/" . $config['banmask'] . $ip);
if ($count >= $config['countaban']){
for($i = 0; $i <= count($config['commands']) - 1; $i++)
@system(str_replace("[IP]",$ip,$config['commands'][$i]));
}else{
$time = filemtime($config['directory'] . "/" . $config['banmask'] . $ip);
if ($time >= time() - $config['time']){
$count++;
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,$count);
fclose($f);
}else{
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,"1");
fclose($f);
}
}

}else{
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,"0");
fclose($f);
}
exit($config['message']);
}

}else{
$f=fopen( $config['directory'] . "/" . $config['checkmask'] . $ip , 'w');
fclose($f);
}

}
?>[/CODE]
 
Rubrika
Участник
Сообщения
342
Реакции
43
  • #18
google написал(а):
Если ддос действительно слабенький, можно попробовать использовать PHP скрипты, но они будут загружать сервер и годятся только как временное решение проблемы.
Скрипт нужно инклюдить в исполняемый файл, в index.php, например.

Создаем файл, допустим, antiddos.php, туда копируем любой код из нижеприведенных, затем в файле index.php пишем вверху:

include("antiddos.php");

exit; // нужно дать скрипту побанить ботов некоторое время, а потом можно закомментировать exit.


Кто-нибудь может прокомментировать данные по ддос файлам?



Код:
<?php
class antiDdos
{
    // дебаг
    public $debug = false;
    // директория для хранения файлов индефикации запросов
    public $dir = '_bots/';
    // номер icq администратора
    public $icq = '123456';
    // сообщение при выключенном сайте
    public $off_message = 'Временные неполадки, пожалуйста, подождите.';
    // индивидуальный индефикатор
    private $indeficator = null;
    // сообщение при бане, работают шаблоны, можно использовать - {ICQ}, {IP}, {UA}, {DATE}
    public $ban_message = 'Вы были заблокированы antiddos системой.
                          Если это ошибка обратитесь к администратору, icq of admin: {ICQ}
                          <hr>(c)XakNet antiddos module, ваш IP - {IP}(<i>{UA}</i>), date - {DATE}';
    // команда выполнения бана в файрволле
    public $exec_ban = 'iptables -A INPUT -s {IP} -j DROP';
    // тип защиты от ддоса:
    /* Возможные значения $ddos 1-5:
    | 1. Простая проверка по кукам, по умолчанию(рекомендую) 
    | 2. Двойная проверка через $_GET antiddos и meta refresh 
    | 3. Запрос на авторизацию WWW-Authenticate 
    | 4. полное отключение сайта, боты не блокируются!!! 
    | 5. выключать сайт если нагрузка слишком большая на сервере, боты не блокируются!!! 
    */
    var $ddos = 1;
    // часть домена поисковых ботов, см strpos()
    private $searchbots = array('googlebot.com', 'yandex.ru', 'ramtel.ru', 'rambler.ru', 'aport.ru', 'sape.ru', 'msn.com', 'yahoo.net');
    // временная переменные нужные для работы скрипта
    private $attack = false;
    private $is_bot = false;
    private $ddosuser;
    private $ddospass;
    private $load;
    public $maxload = 80;
 
    function __construct($debug)
    {
        @session_start() or die('session_start() filed!');
        $this->indeficator = md5(sha1('botik' . strrev(getenv('HTTP_USER_AGENT'))));
        $this->ban_message = str_replace(array('{ICQ}', '{IP}', '{UA}', '{DATE}'),
                                        array($this->icq, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'], date('d.m.y H:i')),
                                        $this->ban_message
                                        );
        if (eregi(ip2long($_SERVER['REMOTE_ADDR']), file_get_contents($this->dir . 'banned_ips')))
            die($this->ban_message);
        $this->exec_ban = str_replace('{IP}', $_SERVER['REMOTE_ADDR'], $this->exec_ban);
        $this->debug = $debug;
        if(!function_exists('sys_getloadavg'))
        {
            function sys_getloadavg()
            {
                return array(0,0,0);
            }
        }
        $this->load = sys_getloadavg();
        if(!$this->sbots())
        {
            $this->attack = true;
            $f = fopen($this->dir . ip2long($_SERVER["REMOTE_ADDR"]), "a");
            fwrite($f, "query\n");
            fclose($f);
        }
    }
 
    /**
    * Старт работы антиддоса
    **/
    function start()
    {
        if($this->attack == false)
            return;
        switch($this->ddos)
        {
            case 1:
                $this->addos1();
                break;
            case 2:
                $this->addos2();
                break;
            case 3:
                $this->ddosuser = substr(ip2long($_SERVER['REMOTE_ADDR']), 0, 4);
                $this->ddospass = substr(ip2long($_SERVER['REMOTE_ADDR']), 4, strlen(ip2long($_SERVER['REMOTE_ADDR'])));
                $this->addos3();
                break;
            case 4:
                die($this->off_message);
                break;
            case 5:
                if ($this->load[0] > $this->maxload)
                {
                    header('HTTP/1.1 503 Too busy, try again later');
                    die('<center><h1>503 Server too busy.</h1></center><hr><small><i>Server too busy. Please try again later. Apache server on ' . $_SERVER['HTTP_HOST'] . ' at port 80 with <a href="http://forum.xaknet.ru/">ddos protect</a></i></small>');
                }
                break;
            default:
                break;
        }
        if ($_COOKIE['ddos'] == $this->indeficator)
            @unlink($this->dir . ip2long($_SERVER["REMOTE_ADDR"]));
    }
 
    /**
    * Функция проверяет не является ли клиент поисковым ботом
    **/
    function sbots()
    {
        $tmp = array();
        foreach($this->searchbots as $bot)
        {
            $tmp[] = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), $bot) !== false;
            if($tmp[count($tmp) - 1] == true)
            {
                $this->is_bot = true;
                break;
            }
        }
        return $this->is_bot;
    }
 
    /**
    * Функция бана
    **/
    private function ban()
    {
        if (! system($this->exec_ban))
        {
            $f = fopen($this->dir . 'banned_ips', "a");
            fwrite($f, ip2long($_SERVER['REMOTE_ADDR']) . '|');
            fclose($f);
        }
        die($this->ban_message);
    }
    /**
    * Первый тип защиты
    **/
    function addos1()
    {
        if (empty($_COOKIE['ddos']) or !isset($_COOKIE['ddos']))
        {
            $counter = @file($this->dir . ip2long($_SERVER["REMOTE_ADDR"]));
            setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356); // ставим куки на год.
            if (count($counter) > 10) {
                if (! $this->debug)
                    $this->ban();
                else
                    die("Блокированы.");
            }
            if (! $_COOKIE['ddos_log'] == '1')
            {
                if (! $_GET['antiddos'] == 1)
                {
                    setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //чтоб не перекидывало постоянно рефрешем.
                    if(headers_sent())
                        die('Header already sended, check it, line '.__LINE__);
                    header("Location: ./?antiddos=1");
                }
            }
        } elseif ($_COOKIE['ddos'] !== $this->indeficator)
        {
            if (! $this->debug)
                $this->ban();
            else
                die("Блокированы.");
        }
    }
 
    /**
    * Второй тип защиты
    **/
    function addos2()
    {
        if (empty($_COOKIE['ddos']) or $_COOKIE['ddos'] !== $this->indeficator)
        {
            if (empty($_GET['antiddos']))
            {
                if (! $_COOKIE['ddos_log'] == '1')
                    //проверям есть ли запись в куках что был запрос
                    die('<meta http-equiv="refresh" content="0;URL=?antiddos=' . $this->indeficator . '" />');
            } elseif ($_GET['antiddos'] == $this->indeficator)
            {
                setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356);
                setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем.
            }
            else
            {
                if (!$this->debug)
                    $this->ban();
                else
                {
                    echo "May be shall not transform address line?";
                    die("Блокированы.");
                }
            }
        }
    }
 
    /**
    * Третий тип защиты
    **/
    function addos3()
    {
        if (! isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== $this->ddosuser || $_SERVER['PHP_AUTH_PW'] !== $this->ddospass)
        {
            header('WWW-Authenticate: Basic realm="Vvedite parol\':  ' . $this->ddospass . ' | Login: ' . $this->ddosuser . '"');
            header('HTTP/1.0 401 Unauthorized');
            if (! $this->debug)
                $this->ban();
            else
                die("Блокированы.");
            die("<h1>401 Unauthorized</h1>");
        }
    }
}
/*
// Exmaple
$ad = new antiDdos(false);
$ad->dir = 'bots/';
$ad->ddos = 2;
$ad->start();
*/
?>


Код:
[CODE]<?php
/*
*--------------------------------------------------------
* Модуль antioverload
*--------------------------------------------------------
* Модуль предназначен для ограничения доступа к сайту или
* к страницам, где он включён.
* Принцип работы в том, что запоминается ip-адрес и время
* обращения с этого адреса. И если в течение заданного
* времени происходит обращение с того же адреса, то ему
* выдаётся ошибка 503.
* Модуль необходимо подключать к скрипту самым первым.
* Этим обеспечивается быстрота его работы.
*--------------------------------------------------------
*/
/* Время задержки в секундах */
$ad_delay=2;
/* Путь к папке с временными файлами. Должен существовать */
$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',
);
/*
*---------------------------------------------------------
* Список доверенных IP.
*---------------------------------------------------------
*/
$ad_good_ip = array(
    '217.107.36.73',
);
/*
*----------------------------------------------------------
* Функция создаёт в указанной директории файл, начинающийся
* с буквы 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( in_array($_SERVER['REMOTE_ADDR'], $ad_good_ip) ) {
    $good_ip = true;
} else {
    $good_ip = false;
}
/*
*---------------------------------------------------------
* Поисковые роботы не любят, когда к адресу страницы
* добавляется переменная сессии. Поэтому, если на сайте
* используются сессии, то их лучше включать, если агент -
* не робот.
* Если сессии не используются, то этот кусок можно убрать.
*---------------------------------------------------------
*/
if (!$ad_IsRobot AND !$good_ip){
  session_start();
}
if (!$ad_IsRobot AND !$good_ip){
  /*** Чтение каталога и удаление старых файлов ***/
  $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>Ошибка 503</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
</head>
<body>
<h1>Ошибка 503 (Service Unavailable)</h1>
<p>Сервер не может в данный момент выдать запрашиваемую Вами страницу.
Попробуйте вызвать эту страницу позже (клавиша F5).</p>
</body>
</html>
<?php
      ad_WiteIP($ad_DirName);  // Перед выходом записываем ip
      exit;
  }else{
      ad_WiteIP($ad_DirName);
  }
}
?>
<?php
#(c) Boolean.
#####################################################################################
#####################################################################################
#####################################################################################
#####################################################################################
$config['time'] = 2;
#Время обращения к скрипту, после которого будет(возможно) выдан бан.
$config['countaban'] = 5;
#количество возможных нарушений времени обращения, такая возможность введена для более детально точного отделения пользователей от атакующих ботов.
$config['directory'] = '_temp';
#временна директория, должна существовать, и иметь права на запись.
$config['checkmask'] = 'check';
#маска для проверки, не стоит трогать.
$config['banmask'] = 'ban';
#маска для бана, не стоит трогать.
#Комманды после нарушения времени и кол-ва обращений. Используйте константу [IP] - IP Бота.
$config['commands'][] = 'iptables -A ISPMGR -s [IP] -j DROP';
$config['commands'][] = 'iptables -I INPUT -s [IP] -j DROP';
#Доверенные IP.
$config['white']['ip'] = @file('whiteips.txt');
#Доверенные ЮзерАгенты.
$config['white']['useragent'][] = 'Google bot';
$config['white']['useragent'][] = 'Yasha bot';
#Сообщение для пользователя. HTML Работает.
$config['message'] = file_get_contents("ddosmessage.html");
#####################################################################################
#####################################################################################
#####################################################################################
#####################################################################################
$ip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
if ( ! is_dir($config['directory']) )
exit("Temp directory not found.");
if ( ! is_writable($config['directory']) )
exit("Temp directory is not writable.");
if ( @in_array($ip,$config['white']['ip']) || @in_array($useragent,$config['white']['useragent']) )
$white = true;
if ( ! $white ){

if ( file_exists( $config['directory'] . "/" . $config['checkmask'] . $ip ) ){

$time = filemtime($config['directory'] . "/" . $config['checkmask'] . $ip);
$f=fopen( $config['directory'] . "/" . $config['checkmask'] . $ip , 'w' );
fclose($f);

if ($time >= time() - $config['time']){

if (file_exists($config['directory'] . "/" . $config['banmask'] . $ip)){

$count = file_get_contents($config['directory'] . "/" . $config['banmask'] . $ip);
if ($count >= $config['countaban']){
for($i = 0; $i <= count($config['commands']) - 1; $i++)
@system(str_replace("[IP]",$ip,$config['commands'][$i]));
}else{
$time = filemtime($config['directory'] . "/" . $config['banmask'] . $ip);
if ($time >= time() - $config['time']){
$count++;
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,$count);
fclose($f);
}else{
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,"1");
fclose($f);
}
}

}else{
$f=fopen( $config['directory'] . "/" . $config['banmask'] . $ip , 'w' );
fwrite($f,"0");
fclose($f);
}
exit($config['message']);
}

}else{
$f=fopen( $config['directory'] . "/" . $config['checkmask'] . $ip , 'w');
fclose($f);
}

}
?>[/CODE]



Вы лично их пробовали? Могу сказать только одно, лишь от одного из моих 4-х скриптов антиддоса я наблюдал небольшую отдачу. Остальные - фигня.
 
makc
Участник
Сообщения
79
Реакции
6
  • #19
хрень всё это по-моему, правильно сделал что сервис подключил:thumbsup: а так, на которые натыкался, после 2-ух обновлений грузит страницу ошибки, а это как минимум бесит...
 
skroliks
PHP, MySQL, CSS
Участник
Сообщения
280
Реакции
46
  • #20
Rubrika написал(а):
CloudFlare подключил. Нормальных скриптов по анти-ддосу не нашел. Все с ошибками.
А CloudFlare действительно защищает от ddos-атак и сколько это стоит?
 
Сверху