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

GoodLuck777

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

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

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

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

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

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

ps блокировать IP адрес нападающего или решения на PHP не предлагать, думал - не поможет ...
 

jdoe

Новичок
примерно так
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.
 

GoodLuck777

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

С респектом,
GL
 

phprus

Moderator
Команда форума
jdoe
Поисковики лучше по USER_AGENTу отлавливать так как их ip меняться могут. К тому же помима Yandex, Google, Rambler и msn есть и другие yahoo например.
 

jdoe

Новичок
phprus, ага, согласен, писалось это все вообще в спешке ("мля, флудят!" тыктык... =)), с тех пор не трогалось.
 
Сверху