Подскажите с htaccess, ломают сайт ...

GoodLuck777

Новичок
Подскажите с htaccess, ломают сайт ...

Дело вот в чем:
Есть сайт, который постоянно пытаются сломать, вдаваться в подробности не буду, сайт милиции.

Три дня назад, видимо написав простенький скрипт, кто-то начал ломиться на сайт и открывать страницы по 100 раз и т.п. Так как сайт "тяжелый" в скриптах, то с хостинга пришло письмо, что сайт создает нагрузку на сервер.

Подскажите деликатное решение проблемы? Я понимаю, что делать надо через htaccess, но как? На сайт заходит 100-150 чел. в день, не больше, поэтому можно сделать ограничение для IP адресов по заходу? Т.е. с определенной задержкой? Или запрещать одному IP открывать повторно ту же страницу?

Если не трудно, можно ссылки на примеры или код? Нужно дырку закрыть срочно, ищу, но пока плохо получается.

Заранее всем спасибо.

ps блокировать IP адрес нападающего или решения на PHP не предлагать, думал - не поможет ...
 
примерно так
PHP:
function anti_flood()
{
  $allowed_ips = array(
  "/^213\.180/", // Yandex
  "/^66\.249/", // Google
  "/^81\.19\.6/", // Rambler
  "/^65\.54/", // msn
  );

  foreach($allowed_ips as $allowed_ip) {
    if (preg_match($allowed_ip, $_SERVER['REMOTE_ADDR']))
      return;
  }

  $max_connections = 20;
  $max_seconds = 20;
  $banit=0;
  if (strpos($_SERVER["HTTP_USER_AGENT"],"Teleport")!==false) $banit=1;
  $basedir="/home/inventech/stat/";
  $statfile=$basedir.$_SERVER['REMOTE_ADDR'];
  $stat = @stat($statfile);
  if ($stat) {
    if ($stat[7] > ($max_connections+5)) exit;
    if (!$banit && $stat[9] < (time()-($max_seconds+1))) @unlink($statfile);
    else if ($banit || $stat[7] >= $max_connections) {
      $f = fopen($_SERVER['DOCUMENT_ROOT']."/.htaccess","a");
      flock($f,LOCK_EX);
      fwrite($f,"Deny From ".$_SERVER['REMOTE_ADDR']."\n");
      flock($f,LOCK_UN);
      fclose($f);
      $f = fopen($statfile,"a");
      flock($f,LOCK_EX);
      fwrite($f,"This IP exceeded  connections limit and has been banned in .htaccess");
      flock($f,LOCK_UN);
      fclose($f);
      exit;
    }
  }

  $f=@fopen($statfile,"a");
  if($f){
    flock($f,LOCK_EX);
    fwrite($f,'.');
    flock($f,LOCK_UN);
    fclose($f);
  }

  //cleanup old stat files
  $date_now = date("Ymd");
  if (!file_exists($basedir.$date_now)) {
    @touch($basedir.$date_now);
    $dh = opendir($basedir);
    if ($dh) { while (($file=readdir($dh))!==false) {
      if ($file=='.' || $file=='..') continue;
      $sfile = $basedir.$file;
      $stat = @stat($sfile);
      if ($stat) if ($stat[9] < (time() - 3000) && $stat[7] < $max_connections-1) @unlink($sfile);
    } closedir($dh); }
  }
}
переменные конфигурабельны.

и, конечно, если хостинг позволяет, лучшее решение - mod_dosevasive.
 
Спасибо за обе ссылки! ОЧЕНЬ понравилось второе решение, все четко и идеально.! За сегодня уже есть забаненные )

С респектом,
GL
 
jdoe
Поисковики лучше по USER_AGENTу отлавливать так как их ip меняться могут. К тому же помима Yandex, Google, Rambler и msn есть и другие yahoo например.
 
phprus, ага, согласен, писалось это все вообще в спешке ("мля, флудят!" тыктык... =)), с тех пор не трогалось.
 
Сверху