[мод] AntiOverload (Antiflood) version Nick

Тема в разделе "DLE", создана пользователем ewg777, 1 май 2008.

Информация :
Актуальная версия DataLife Engine 11.3
( Final Release v.11.3 | Скачать DataLife Engine | Скачать 11.3 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.2 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    [MOD] AntiOverload (Antiflood) version Nick
    Скрипт немного изменен относительно предыдущего выложенного на сайте! Теперь запись данных о посетителе заноситься не в файл, а записывается в базу, и данные о каждом флудере, или простом посетителе храняться ровно сутки, по истечении суток запись удаляется чтобы не нагружать вашу базу! Сделан вывод данных в базу с целью дальнейшей доработки скрипта с выводом логов в админ панель обо всех флудерах! Скрипт на мой взгляд написан понятно и что не нравиться в нем можете удалить сами!
    в базе создается 8 столбцов (datetime, time, ip, url, method, agent, referer, flooder)
    в базу заносятся данные время и дата, системное время для расчета времени задержкии очистки базы, ip посетителя или флудера, url на котором он флудил или если простой посетитель, то на каком url находился, метод с помощью которого вызывался url с помощью какой программы или браузера вас посетили, откудого пришол, ну и последняя графа показывает 1 или 0 (1 был флуд, 0 флуда небыло)!
    Установка!
    Копируем файл antiflood.php в папку engine вашего корневого каталога
    Открываем index.php
    находим строку

    Код:
    require_once ROOT_DIR.'/engine/init.php';
    После нее вставляем

    Код:
    require_once ROOT_DIR.'/engine/antiflood.php';
    какое количество запросов и в какой промежуток времени можно осуществить, задается в файле antiflood.php
    это строки

    Код:
    $period=3; //период замера в секундах
    $views=2; //количество разрешённых посещений за период $period
    и скрок хранения файла можно изменить на 40 строке

    В базу добавляем новую таблицу

    PHP:
    CREATE TABLE `dle_flooders` (
    `
    datetimevarchar(255NOT NULL,
    `
    timevarchar(255NOT NULL,
    `
    ipvarchar(255NOT NULL,
    `
    urlvarchar(255NOT NULL,
    `
    methodvarchar(255NOT NULL,
    `
    agentvarchar(255NOT NULL,
    `
    referervarchar(255NOT NULL,
    `
    floodervarchar(255NOT NULL
    ENGINE=MyISAM DEFAULT CHARSET=utf8;

    Сам файл antiflood.php в аттаче!

    По материалам сайта 4dle.ru
     

    Вложения:

    • antiflood.rar
      Размер файла:
      1,5 КБ
      Просмотров:
      4
  2. PoMaH

    PoMaH

    Регистр.:
    8 июн 2006
    Сообщения:
    753
    Симпатии:
    142
    Neodnokratno uze govorilos. ot DDos normalnaja zasyta tolko na Hardwarnom urovne.


    a eto silno ne sposiot. vsioravno zamuciajut server...
     
  3. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    Я понимаю, что у Вас нету возможности писать по-русски! Но все же хватит писать всякую чушь! Где написано, что этот скрипт спасает от DDOS? Это скрипт возможно спасет от лишней нагрузки! И все!
     
  4. shisha

    shisha Прохожие

    Эээ Дорогие товарищи хочу просто ругнутся матом и сказать гавно и лажа!!! Дабы что такое анти флуд?? Это вещь которая присечет флуд Базы данных а что мы имеем тут? Мы имеет анти флуд который вечно посылает запросы на базу ГаВНО товарищие гавно! Но тем не менее я не просто пришол ругатся и громко всех обсерать а просто подсказать отличный анти флуд скрипт который все записи делает В отдельный фалы и максимум что он будет еба** так это FTP чей кеш и проство ограничены только вашим выходом в сеть ну и кучкой мелочей. Не много о скрипте скрипт написан неким дмитрием или как его там в 2002 году является брендом мини защиты сайта, легко подключается к любой странице простоым инклодм после <?php даже как то писал ранее версию данного скрипта под дату ну в плане что под него напишеш? только инклод конфига и все =)) а так юзайте на здоровье!!!

    и П.С. Пути писать надо полные относиельно сервера илиже выстовлять рутники но при этом важно! При подключении анти флуда к индоксу ставить в самый верх под пхп ну можно еще под рутники поставить конечноже их тоже придется в самый верх впиндюрить.
    PHP:
    <?
    /*
       =================================================================
                  _DIMA_NOFLOOD.PHP, version 1.1, 2002-11-11
       =================================================================

       (c) Dmitry Borodin
       Homepage: http://php.spb.ru/
       Report bugs: dima@php.spb.ru

       Что это:

          Модуль защиты от флуда PHP-сайтов методом частых вызовов 
          PHP-файлов, для создания большой нагрузки. Защищает так же
          от автоматического выкачивания сайта с одного IP.

       =================================================================

       Описание
       ~~~~~~~~
       Для подключения этого модуля напишите include("_dima_noflood.php")
       в самом начале вашей программы. В случае флуда этот модуль завершит
       работу по команде exit. При нормальной работе - только увеличит 
       счетчики загрузок и никак не отразится на вашем скрипте.

       Для настройки программы создайте сколько угодно правил на разное 
       кол-во секунд. Например, первое правило "не более 11 загрузок за 10 
       секунд" надо записать как "$nf_flood[10]=>11". Если хочется второе
       правило, допустим "не более 200 загрузок за час", то 
       дополнительно в тот же массив надо дописать "$nf_flood[3600]=>200" 
       (3600 - это 1 час). Правил может быть любое кол-во (но чем меньше,
       тем быстрее работает).

       Если по какому либо правилу возникает флуд, т.е. кол-во загрузок 
       за последние Х секунд превысило N заданных раз, то происходит 
       следующее:
       1. доступ для этого IP-адреса закрывается
       2. остальные правила как считали, так и продолжают считать/следить
          за допустимой нагрузкой
       3. сработавшее на флуд правило запоминает текущее время каждого 
          обращения, из-за чего при регулярных продолжениях вызовов сайта
          этот счетчик не будет никогда сброшен
       Сработавшее флуд-правило очистит счетчик запросов, т.е. снимет игнор,
       только если в течении Х секунд к сайту не будет ни одного запроса.
       Если сработало правило флуда на 5 минут, то пользователь-флудер 
       должен покинуть ваш сайт минимум на 5 минут. Если этот пользователь
       обратится через 4 минуты на сайт, то время окончания игнора повторно 
       увеличится на 5 минут. Таким образом, это очень продвинута защита от 
       скачиваний - стоит программе превысить любое из правил флуда, 
       то повторные попытка что-то скачать только оттянут время снятия 
       игнора. Дополнительно это приведет к срабатыванию более строгих 
       правил, например на 60 минут (и придется уже минимум 60 минут 
       не обращаться к сайту, чтобы игнор был сброшен).

       Раз в $nf_cron_run секунд запускается функция поиска старых файлов,
       которые устарели не менее, чем на $nf_old_file секунд. По-умолчанию,
       поиск производится раз в 20 минут, при котором стираются все файлы,
       которые устарели минимум на 2 часа. Внимание! Программа стирает ВСЕ
       файлы в своем каталоге ($nf_path), которые не начинаются с ".". 
       Поэтому, чтобы закрыть каталог от доступа через браузер, положите
       туда файл ".htaccess" из 2х строк:
           Order Allow,Deny
           Deny from all

       Кроме проверки на флуд программа не позволит вызвать ни одного 
       вашего PHP-скрипта параллельно. Т.е. если идет параллельный вызов,
       а старый вызов (и процесс с PHP-скриптом) еще не закончился,
       то более новый запрос будет отвергнут. Это достигается простым 
       открытием файла. Файл после открытия не закрывается, из-за чего 
       остается блокированным на весь период работы вашего скрипта.
       
       Сообщения/ошибки:
       - в случае параллельного вызова программа пишет 
         "Parallel processing disable." и завершает работу
       - при достижении флуда программа пишет "Flood detect!" и завершается
       - если невозможно открыть файл на запись/чтение, то программа пишет 
         короткое имя файла (без каталога) и причину, работа не прерывается,
         т.е. ваш скрипт получит управление (такие ошибки возможны только 
         при первоначальной настройке программы)

       Когда вы меняете набор флуд правил в $nf_flood, то сразу после этого 
       стирайте все файла в каталоге $nf_path!

       =================================================================
    */

       //
       // Путь к каталогу, где будут копится файлы
       // В этом каталоге будут стерты все файлы, кроме тех, что начинаются 
       // с "." в имени.
       //
       // ОБЯЗАТЕЛЬНО ЗАДАЙТЕ КАТАЛОГ ДЛЯ ВРЕМЕННЫХ ФАЙЛОВ:
       //
       //$nf_path=getenv("DOCUMENT_ROOT")."/tmp-ip/";

       //exit(getcwd());
       
    $nf_path="/var/www/data/talken/tmp-ip/";

       
    // имя файла для юзера - генерится из его IP-адреса
       
    $nf_fip=$nf_path.getenv("REMOTE_ADDR");

       
    // имя файла для встроенного крона (должно начинаться с точки)
       
    $nf_fcron=$nf_path.".time";

       
    //
       // сек  => кол-во
       //
       //    не более скольки загрузок за сколько секунд можно сделать, 
       //    чтобы не получить игнор
       //
       
    $nf_flood=array(
          
    10   => 10,      // не более 10 загрузок за 10 секунд
          
    60   => 30,      // не более 30 загрузок за минуту
          
    300  => 50,      // не более 50 загрузок за 5 минут
          
    3600 => 200,     // не более 200 загрузок за час
       
    );

       
    $nf_cron_run=1200// раз в сколько секунд проверять старые файлы

       
    $nf_old_file=7200// через сколько секунд считать файл старым (и удалять)



    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
       


    function cron_update($fn,$update) {

       if (!
    file_exists($fn)) {
          if (!@
    touch($fn)) {
             echo 
    "не могу создать <b>".basename($fn)."</b>, проверьте права на файлы (w+)<br>";
             return -
    1;
          }
       }
       else { 
          if (
    time()-filemtime($fn)<$update) {return 0;}
       }
       
       
    $f=@fopen($fn,"r+");
       if (!
    $f) {
          echo 
    "не могу открыть <b>".basename($fn)."</b>, проверьте права на файлы (r+)<br>";
          return -
    1;
       }
       if (!
    flock($f,6)) {return;}
       
    $text=fgets($f,100);
       if (
    time()-intval($text)<$update) {return 0;}
       
    fseek($f,0,SEEK_SET);
       
    fwrite($f,time()."    ");
       
    fclose($f);

       return 
    1;

    }


       
    $nf_cron_code=cron_update($nf_fcron,$nf_cron_run);
       if (
    $nf_cron_code==-1) return;
       if (
    $nf_cron_code==1) {
          if (
    $nf_dir=@opendir($nf_path)) {
             
    $nf_time=time()-$nf_old_file;
             while ((
    $nf_tmp=readdir($nf_dir))!==false) {
                if (
    $nf_tmp[0]==".") continue;
                if (
    filemtime($nf_path.$nf_tmp)<$nf_time && 
                   
    preg_match("!^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$!",$nf_tmp))
                {
                   if (!
    unlink($nf_path.$nf_tmp)) {
                      echo 
    "не могу удалить <b>$nf_tmp</b><br>";
                   }
                }
             }
             
    closedir($nf_dir);
          }
       }
       unset(
    $nf_cron_code);


       if (
    file_exists($nf_fip)) {
          
    $nf_f=@fopen($nf_fip,"r+");
          if (!
    flock($nf_f,6)) exit("Parallel processing disable.");
          if (!
    $nf_f) {
             echo 
    "не могу открыть <b>".basename($nf_fip)."</b> (r+)<br>";
             return;
          }
          
    $nf_buf=fgets($nf_f,1000);
          
    $nf_buf=explode("|",$nf_buf);
       }
       else {
          for (
    $nf_i=0$nf_i<count($nf_flood)*2$nf_i++) $nf_buf[]=0;
          
    $nf_f=@fopen($nf_fip,"a+");
          if (!
    $nf_f) {
             echo 
    "не могу создать <b>".basename($nf_fip)."</b> (a+)<br>";
             return;
          }
          if (!
    flock($nf_f,6)) exit("Parallel processing disable.");
       }


       
    $nf_i=0;
       
    $nf_stopflag=0;

       
    //echo "<pre>";print_r($nf_buf);

       
    foreach ($nf_flood as $nf_k=>$nf_v) {
          if (
    $nf_buf[$nf_i+1]+$nf_k<time()) { 
             
    $nf_buf[$nf_i]=1;
             
    $nf_buf[$nf_i+1]=time();
          }
          else {
             if (
    $nf_buf[$nf_i]>$nf_v) {
                
    $nf_stopflag=1;
                
    $nf_buf[$nf_i+1]=time();
             }
             
    $nf_buf[$nf_i]++;
          }
          
    $nf_i+=2;
       }


       
    ftruncate($nf_f,0);
       
    fseek($nf_f,0);
       
    fputs($nf_f,implode("|",$nf_buf));

       
    //print_r($nf_buf);
       
    if ($nf_stopflag) exit("Flood detect!");
       
       unset(
    $nf_f);
       unset(
    $nf_i);
       unset(
    $nf_k);
       unset(
    $nf_v);
       unset(
    $nf_stopflag);
       unset(
    $nf_buf);
       unset(
    $nf_fip);
       unset(
    $nf_path);
       unset(
    $nf_flood);
       unset(
    $nf_cron_run);
       unset(
    $nf_cron_idle);

    ?>
     
  5. masima

    masima

    Регистр.:
    9 мар 2007
    Сообщения:
    732
    Симпатии:
    1.338
    а не проще сделать на sql тригеры и внедрить их в бд чтобы аудит вёлся... да и в скрипте прописать чтобы данные из аудита брались о числе строк изменённых в базе и блочился акк который превысит лимит? )))
     
  6. shisha

    shisha Прохожие

    Мас а каму нежно ак блочить и вести пыльный учет бд если проще и лучше просто заблокировать подключение к бд чтобы вообще не учета не запроса для флудо подобных
     
  7. ewg777

    ewg777

    Регистр.:
    6 авг 2007
    Сообщения:
    763
    Симпатии:
    321
    Шишо, Что ты несешь? Кто сказал, что этот скрипт отличный и является спасением от всех бед? Написано лишь "По материалам сайта 4dle.ru"! Так что все притензии к авторам!
     
  8. $aSH

    $aSH

    Регистр.:
    3 ноя 2006
    Сообщения:
    536
    Симпатии:
    233
    а все гавно с 4dle тащить в рот и на форум не нужно. если человек сюда запостил, считается, что он в этой теме разбирается и СОВЕТУЕТ тот метод.

    любая "защита" с использованием sql это пипец. давайте вместо запросов с комментами, запросами новых страниц бедем мучать сервак другими запросами. автору убиться ап стену
     
Статус темы:
Закрыта.