Помощь Система защиты от HTTP-флуда

Тема в разделе "DLE", создана пользователем Demon425, 9 янв 2009.

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

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

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

    Demon425

    Регистр.:
    9 июл 2008
    Сообщения:
    461
    Симпатии:
    116
    Всем известен хак Antioverload для DLE, вот он ...

    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;

    И главный вопрос реально ли это сделать ? :) думаю большинству ДЛешников это бы пригодилось ...
     
  2. sk8er

    sk8er SEO и SMO гуру :3

    Регистр.:
    21 июл 2008
    Сообщения:
    398
    Симпатии:
    25
    Пардон, а вообще для чего тот скрипт?:nezn:
     
  3. Max399

    Max399

    Регистр.:
    7 май 2007
    Сообщения:
    245
    Симпатии:
    26
    Цитата с 4дле:

     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Реально.
    В сабже написано.
     
  5. E-body

    E-body

    Регистр.:
    6 сен 2007
    Сообщения:
    986
    Симпатии:
    331
    Банн атакуещего прописывается в .htaccess

    HTML:
    <?php
    
    
    $usehtaccessbans = 1;            # 1 = modify .htaccess to ban IPs, 0 = don't ban IPs.
    $filterGETvars = 1;                # 1 = sterilize HTML tags in GET variables, 0 = don't
    $filterCOOKIEvars = 1;            # 1 = sterilize HTML tags in COOKIE variables, 0 = don't
    $filterPOSTvars = 0;            # 1 = sterilize HTML tags in POST variables, 0 = don't
    $extraPOSTprotection = 1;        # 1 = use the extra POST protection, 0 = don't
    $extraGETprotection = 0;        # 1 = use the extra GET protection, 0 = don't (not recommended!)
    $checkmultiPOST = 1;            # 1 = only allow maxmultiPOST number of successive POSTs, 0 = don't care
    $maxmultiPOST = 6;                # Maximum number of POST operations in a row, if checkmultipost is on.
    $zipcompress = 0;                # 1 = Compress pages using GZIP library (lower bandwidth, higher CPU), 0 = don't
    $compresslevel = 9;                # Compression level for zipcompressing, from 1 (low) to 9 (maximum)
    $cpuloadmonitor = 0;            # 1 = block access if over a certain system load, 0 = don't
    $cpumaxload = 10.0;                # Maximum 5 minute system load average before blocking access
    $ccisessionpath = "";            # if not blank, sets a directory path to store session files.
    
    ##### Encryption/Encoding Variables
    
    $javababble = 0;                # 1 = Use Encoding/Encrypting (Must be on for any), 0 = Don't
    $javaencrypt = 0;                # Do actual encrypting of HTML, not just escaping (warning: may slow display)
    $preservehead = 0;                # 1 = Only encode/encrypt between BODY tags, 0 = encode/encrypt whole document
    
    ##################
    #
    # Check for in-script overrides
    #
    ##################
    
    if (isset($zipoverride)) {
      if (!isset($_REQUEST["zipoverride"])) {
        $zipcompress = $zipoverride;
        unset($zipoverride);
      }
    }
    
    if (isset($babbleoverride)) {
      if (!isset($_REQUEST["babbleoverride"])) {
        $javababble = $babbleoverride;
        unset($babbleoverride);
      }
    }
    
    ##################
    #
    # Function: CCIJavaBabble
    #
    # Usage: Takes some HTML, url-encodes it (jumbles it) then returns the javascript needed to display it properly.
    #
    ##################
    
    function CCIJavaBabble($myoutput) {
      global $mycrypto, $myalpha2, $javaencrypt, $preservehead;
      $s = $myoutput;
      $s = ereg_replace("\n","",$s);
    
      if ($preservehead) {  
        eregi("(^.+<body[^>]*>)",$s,$chunks);
        $outputstring = $chunks[1];
        eregi_replace($headpart,"",$s);
    
        eregi("(</body[^>]*>.*)",$s,$chunks);
        $outputend = $chunks[1];
        eregi_replace($footpart,"",$s);
      } else {
        $outputstring = "";
        $outputend = "";
      }
      
      if ($javaencrypt) {
        $s = strtr($s,$myalpha2,$mycrypto);
        $s = rawurlencode($s);
        $outputstring .= "<script>var cc=unescape('$s'); ";
        $outputstring .= "var index = document.cookie.indexOf('" . md5($_SERVER["REMOTE_ADDR"] . $_SERVER["SERVER_ADDR"]) . "='); " .
          "var aa = '$myalpha2'; " .
          "if (index > -1) { " .
          "  index = document.cookie.indexOf('=', index) + 1; " .
          "  var endstr = document.cookie.indexOf(';', index); " .
          "  if (endstr == -1) endstr = document.cookie.length; " .
          "  var bb = unescape(document.cookie.substring(index, endstr)); " .
          "} " .
          "cc = cc.replace(/[$myalpha2]/g,function(str) { return aa.substr(bb.indexOf(str),1) }); document.write(cc);";
      } else {
        $outputstring .= "<script>document.write(unescape('" . rawurlencode($s) . "'));";
      }
      $outputstring .= "</script><noscript>You must enable Javascript in order to view this webpage.</noscript>" . $outputend;
           
      return $outputstring;
    }
    
    ##################
    #
    # Function: CCIClearSession
    #
    # Format: CCIClearSession()
    # Returns: Nothing
    #
    # Usage: Clears all the data out of the session record other than data used for this script
    #
    ##################
    
    function CCIClearSession() {
      $getvariables = array_keys($_SESSION);
      $count = 0;
      while($count < count($getvariables)) {
        if (substr($getvariables[$count],0,7) != "ccisec-") {
          session_unregister($getvariables[$count]); 
          if (ini_get('register_globals')) unset($$getvariables[$count]);
        }
        $count++;
      }
    }
    
    ##################
    #
    # Function: CCIBanIP
    #
    # Format: CCIBanIP(IPAddress)
    # Returns: Nothing
    #
    # Usage: Will open and add a deny line to the .htaccess file in the same directory to deny all
    #        accessing by a given IP address.
    #
    ##################
    
    function CCIBanIP($banip) {
      $filelocation = ".htaccess";
      $limitend = "# End of CCI Security Section\n";
      $newline = "deny from $banip\n";
      if (file_exists($filelocation)) {
        $mybans = file($filelocation);
        $lastline = "";
        if (in_array($newline,$mybans)) exit();
        if (in_array($limitend,$mybans)) {      
          $i = count($mybans)-1;
          while ($mybans[$i] != $limitend) {
            $lastline = array_pop($mybans) . $lastline;
            $i--;
          }
          $lastline = array_pop($mybans) . $lastline;
          $lastline = array_pop($mybans) . $lastline;
          $lastline = array_pop($mybans) . $lastline;
          array_push($mybans,$newline,$lastline);
        } else {
          array_push($mybans,"\n\n# CCI Security Script\n","<Limit GET POST>\n","order allow,deny\n",$newline,"allow from all\n","</Limit>\n",$limitend);
        }
      } else {
        $mybans = array("# CCI Security Script\n","<Limit GET POST>\n","order allow,deny\n",$newline,"allow from all\n","</Limit>\n",$limitend);
      }  
      $myfile = fopen($filelocation,"w");
      fwrite($myfile,implode($mybans,""));
      fclose($myfile);
        
    }
    
    ##################
    #
    # Function: CCIFloodCheck
    #
    # Format: CCIFloodCheck("identifier",interval,threshold)
    # Returns: 1 if requested without minimum interval, a threshold number of times.  0 if not.
    #
    # Usage: For functions that require flood control pass a unique identifier, the minimum number of
    #        seconds that should be waited between repeats of the function, and a number of times that
    #        function can be called too quickly before it sets off the flood trapping.
    #
    ##################
    
    function CCIFloodCheck($identifier,$interval,$threshold=1) {
      $myresult = 0;
      if (isset($_SESSION["ccisec-" . $identifier])) {
        if ($_SESSION["ccisec-" . $identifier] > (time()-$interval)) {
          if ($threshold<2) {
            $myresult = 1;
          } else {
            if (!isset($_SESSION["ccisec-" . $identifier . "-counter"])) {
              $_SESSION["ccisec-" . $identifier . "-counter"] = 1;
            } else {
              $_SESSION["ccisec-" . $identifier . "-counter"]++;
              if ($_SESSION["ccisec-" . $identifier . "-counter"] >= $threshold) {
                $myresult = 1;
              }
            }
          }
        }
        $_SESSION["ccisec-" . $identifier] = time();
      }
      return $myresult; 
    }
    
    ################################################################################
    
    srand(time());
    if (eregi("ccisecurity\.php",$_SERVER["SCRIPT_NAME"])) exit();
    
    if ($ccisessionpath != "") session_save_path($ccisessionpath);
    session_name(md5($_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_HOST"] . "CCI"));
    
    ini_set("session.use_only_cookies","1");
    ini_set("session.use_trans_sid","0");
    
    if (($zipcompress) && (eregi("gzip",$_SERVER["HTTP_ACCEPT_ENCODING"]))) {
      ini_set("zlib.output_compression","On");
      ini_set("zlib.output_compression_level",$compresslevel);
      ob_start("ob_gzhandler"); 
    }
    if ($javababble) {
      if ($javaencrypt) {
        $myalpha = array_merge(range("a","z"),range("A","Z"),range("0","9"));
        $myalpha2 = implode("",$myalpha);
        shuffle($myalpha);
        $mycrypto = implode("",$myalpha);
        setcookie(md5($_SERVER["REMOTE_ADDR"] . $_SERVER["SERVER_ADDR"]),$mycrypto);
        unset($myalpha);
      }
      ob_start("cciJavaBabble");
    }
    
    if (substr_count($_SERVER["SERVER_NAME"],".")>1) {
      $cookiedomain = eregi_replace("^[^\.]+\.",".",$_SERVER["SERVER_NAME"]);
    } else $cookiedomain = "." . $_SERVER["SERVER_NAME"];
    
    $ip = $_SERVER["REMOTE_ADDR"];
    $mykeyname = md5($_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_HOST"] . $_SERVER["DOCUMENT_ROOT"] . "CCI");
    $myposthashname = md5($_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_HOST"] . $_SERVER["PATH"] . "CCI");
    
    $myhash = md5($_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_USER_AGENT"] . 
                            $_SERVER["HTTP_HOST"] . $_SERVER["DOCUMENT_ROOT"] . 
                            $_SERVER["SERVER_SOFTWARE"] . $_SERVER["PATH"] . "X");
                                                
    $mysession = md5($_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_HOST"]);                        
    session_id($mysession);
    session_start();
    
    if (!isset($_SESSION["ccisec-errors"])) $_SESSION["ccisec-errors"] = 0;
    if ($_SESSION["ccisec-errors"]>=10) {
      CCIBanIP($ip);
      exit();
    }
    
    if ($_SESSION["ccisec-myhash"] != $myhash) {        
      $_SESSION["ccisec-myhash"] = $myhash;
      $_SESSION["ccisec-errors"]++;
      session_write_close();
      Header("Location: http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
      exit();
    }
    
    if ((!isset($_COOKIE[$mykeyname])) || ($_COOKIE[$mykeyname] != $myhash)) {
      
      if (!isset($_SESSION["ccisec-nocookie"])) {
        $_SESSION["ccisec-nocookie"] = 1;
      } else {
        $_SESSION["ccisec-nocookie"]++;
      }
      
      if (($usehtaccessbans) && ($_SESSION["ccisec-nocookie"]>10)) CCIBanIP($ip);
        
      setcookie($mykeyname,$myhash,0,"/",$cookiedomain);
           
      if ($_SESSION["ccisec-nocookie"]>2) {
        echo "<b><h1>Access Denied</h1><br><br>You must enable cookies in order to access this website.  Please do so before returning, as continued attempts to access without cookies may result in a banning of this ip ($ip).</b>";
        session_write_close();
        exit();
      } 
      if ($extraGETprotection) {
        $_SESSION["ccisec-hash"] = md5(uniqid(time()));
        setcookie($myposthashname,$_SESSION["ccisec-hash"],0,"/",$cookiedomain);  
      } 
      CCIClearSession();  
      session_write_close();
      Header("Location: http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
      exit();
    } else $_SESSION["ccisec-nocookie"] = 0;
    
    if (($usehtaccessbans) && ($_SESSION["ccisec-fastaccesses"]>40)) CCIBanIP($ip);
    
    if ($_SESSION["ccisec-fastaccesses"]>10) {
      if ((time()-60) < $_SESSION["ccisec-lastaccess"]) {
        echo "<b><h1>Access Denied</h1><br><br>There have been too many rapid requests from this IP address ($ip).  You must now wait a full 60 seconds before accessing this site again.</b>";
        $_SESSION["ccisec-fastaccesses"]++;
        $_SESSION["ccisec-lastaccess"]=time();
        exit();
      }
    }
    
    if (!isset($_SESSION["ccisec-lastaccess"])) {
      $_SESSION["ccisec-lastaccess"]=time();
    } else {
      if ((time()-2) < $_SESSION["ccisec-lastaccess"]) {
        if (!isset($_SESSION["ccisec-fastaccesses"])) $_SESSION["ccisec-fastaccesses"] = 0;
        $_SESSION["ccisec-fastaccesses"]++;
      } else {
        $_SESSION["ccisec-fastaccesses"] = 0;
      }
      $_SESSION["ccisec-lastaccess"]=time();
    }
    
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
      if ($checkmultiPOST) {
        if (($_SESSION["ccisec-lastoperation"] == "POST") && ($_SESSION["ccisec-opcount"] >= $maxmultiPOST)) {
          echo "<b><h1>Access Denied</h1><br><br>You may not make multiple POST operations in sequence - please return to the website and try again.</b>";
          $_SESSION["ccisec-errors"]++;
          exit(); 
        }
      }     
    
      if ($extraPOSTprotection) {
        if ((!isset($_COOKIE[$myposthashname])) || ($_COOKIE[$myposthashname] != $_SESSION["ccisec-hash"])) {
          echo "<b><h1>Access Denied</h1><br><br>Your browser did not send the correct security data needed to complete a POST operation.  Make sure that you have cookies enabled and then try again, or contact the administration if you feel you are receiving this message in error.</b>";
          $_SESSION["ccisec-errors"]++;
          exit();
        }
      }
    } else if (($extraGETprotection) && ($_SERVER["REQUEST_METHOD"] == "GET")) {
      if ((!isset($_COOKIE[$myposthashname])) || ($_COOKIE[$myposthashname] != $_SESSION["ccisec-hash"])) {
        echo "<b><h1>Access Denied</h1><br><br>Your browser did not send the correct security data needed to complete a GET operation.  Make sure that you have cookies enabled and then try again, or contact the administration if you feel you are receiving this message in error.</b>";
        $_SESSION["ccisec-errors"]++;
        exit();
      }
    } else if ($_SERVER["REQUEST_METHOD"] != "GET") {
      exit();
    }
    
    if (($extraPOSTprotection) || ($extraGETprotection)) {
      srand(time());
      $_SESSION["ccisec-hash"] = md5(uniqid(time()));
      setcookie($myposthashname,$_SESSION["ccisec-hash"],0,"/",$cookiedomain);
    }
    
    if ($_SESSION["ccisec-lastoperation"] == $_SERVER["REQUEST_METHOD"]) {
      if (!isset($_SESSION["ccisec-opcount"])) {
        $_SESSION["ccisec-opcount"] = 1;
      } else {
        $_SESSION["ccisec-opcount"]++;
      }
    } else $_SESSION["ccisec-lastoperation"] = $_SERVER["REQUEST_METHOD"];
    
    # Make special characters safe in any GET based cgi variables.
    
    if ($filterGETvars) {
      $getvariables = array_keys($_GET);
      $count = 0;
      while($count < count($getvariables)) {
        $_GET[$getvariables[$count]] = htmlspecialchars($_GET[$getvariables[$count]]);
        if (ini_get('register_globals')) $$getvariables[$count] = $_GET[$getvariables[$count]];
        $count++;
      }
    }
    
    if ($filterPOSTvars) {
      $getvariables = array_keys($_POST);
      $count = 0;
      while($count < count($getvariables)) {
        $_POST[$getvariables[$count]] = htmlspecialchars($_POST[$getvariables[$count]]);
        if (ini_get('register_globals')) $$getvariables[$count] = $_POST[$getvariables[$count]];
        $count++;
      }
    }
    
    if ($filterCOOKIEvars) {
      $getvariables = array_keys($_COOKIE);
      $count = 0;
      while($count < count($getvariables)) {
        $_COOKIE[$getvariables[$count]] = htmlspecialchars($_COOKIE[$getvariables[$count]]);
        if (ini_get('register_globals')) $$getvariables[$count] = $_COOKIE[$getvariables[$count]];
        $count++;
      }
    }
    
    if ($cpuloadmonitor) {
      $myshelldata = shell_exec("uptime");
      $myshelldata = eregi_replace(".*average.*: ","",$myshelldata);
      $myshelldata = eregi_replace(", .*","",$myshelldata);
      if ($myshelldata >= $cpumaxload) {
        echo "<b><h1>Access Denied</h1><br><br>The server is currently too busy to serve your request.  We apologize for the inconvenience.</b>";  
        exit();
      }
      unset($myshelldata);
    }
    
    unset($count);
    unset($getvariables);
    unset($ip);
    unset($cookiedomain);
    unset($mykeyname);
    unset($myposthashname);
    unset($myhash);
    unset($mysession);
    
    $_SESSION["ccisec-errors"] = 0;
    if (connection_aborted()) exit();
    
    ?>

    Источник: _www.secnull.org
     
    Demon425 нравится это.
  6. MSK

    MSK Писатель

    Регистр.:
    6 дек 2006
    Сообщения:
    7
    Симпатии:
    0
    а как быть с теми, кто на одном ip висит в домашних сетях?
     
  7. nero11

    nero11

    Регистр.:
    8 янв 2007
    Сообщения:
    215
    Симпатии:
    20
    Этот скрипт часто роботы поисковиков банит и пишит их адреса в .htaccess
     
  8. kwin

    kwin

    Регистр.:
    22 авг 2007
    Сообщения:
    413
    Симпатии:
    167
    +конфликтуют сессии
     
  9. trojan.exe

    trojan.exe Постоялец

    Регистр.:
    11 июл 2007
    Сообщения:
    89
    Симпатии:
    7
    А как это прикрутить к дле? При include не открывается сайт и лиса пишет то что сайт перенаправляет сам на себя и это не закончится никогда... куда и как его прописать, и надо ли открывать доступ (чмод) на хтаккцесс?
     
  10. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.211
    Симпатии:
    2.239
    Видел на 4дле (вроде) хак, выдающий ошибку 500, если запросов от одного юзера больше, чем 1 в N секунд...

    Поищите. В целом - способ хороший... Граждане тырящие получал полный сайт из 500-отых ошибок :D
     
Статус темы:
Закрыта.