Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от слива сайта
 
 автор: Diablo_   (30.11.2006 в 11:56)   письмо автору
 
 

Добрый день.
Подскажите пожалуйста, как можно защитить сайт от пользователей, которые патаются посностью слить весь сайт?
Просто у меня это уже не однократно происходит и хостор мне пачками шлёт письма о критической нагрузки на сервер, вот нужно что-то сделать! Они (админы хостера) сказали, что кто-то пытается слить весь сайт, они говорят что бы я защитил скрипты. Но как это сделать, я незнаю!

   
 
 автор: Саня   (30.11.2006 в 12:12)   письмо автору
 
   для: Diablo_   (30.11.2006 в 11:56)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=15976
http://softtime.ru/forum/read.php?id_forum=1&id_theme=5699

   
 
 автор: Diablo_   (30.11.2006 в 12:28)   письмо автору
 
   для: Саня   (30.11.2006 в 12:12)
 

Спасибо за ссылки! Но из них ясно, что защиты нету! только поисковики забаню!

Ещё варианты есть, кроме stop.php?

   
 
 автор: tuder   (30.11.2006 в 12:44)   письмо автору
 
   для: Саня   (30.11.2006 в 12:12)
 

Относительно первой ссылки

> автор: Loki (14.04.2006 в 10:44) письмо автору
> Прекрасный способ доказать поисковикам что вы прекрасно обойдетесь и без них:)

Думаю, что на поисковиках боты уже очень хорошо всё это знают и умеют обходить.

   
 
 автор: Diablo_   (30.11.2006 в 12:46)   письмо автору
 
   для: tuder   (30.11.2006 в 12:44)
 

А если я файл назову не stop.php, а как то иначе? Обойдёт?

   
 
 автор: tuder   (30.11.2006 в 13:32)   письмо автору
 
   для: Diablo_   (30.11.2006 в 12:46)
 

Для предназначенной цели можно обзывать как угодно.
А если бот достаточно умный - то обойдёт.
Например, если после какой-то ссылки его забанят, то в следующий раз он её будет обходить.

   
 
 автор: Loki   (30.11.2006 в 13:41)   письмо автору
 
   для: Diablo_   (30.11.2006 в 11:56)
 

Встречал такие настройки сервера: если в единицу времени склишком большое количество обращений с одного ip, то ip блокируется на 10 минут.
Но такую штуку можно реализовать и на php

   
 
 автор: Diablo_   (30.11.2006 в 15:57)   письмо автору
 
   для: Loki   (30.11.2006 в 13:41)
 

А как такое реализовать?
Просто мне хостер сказал, что если будет ещё хотя бы одна критическая нагрузка на сервер, мой сайт деактивируют!!! Вот мне и нужно это срочно!

   
 
 автор: Unkind   (30.11.2006 в 16:13)   письмо автору
 
   для: Diablo_   (30.11.2006 в 15:57)
 

Да на PHP если делать такое, то сама "защита" сервер может поставить в затруднительное положение :)

   
 
 автор: Diablo_   (30.11.2006 в 16:17)   письмо автору
 
   для: Unkind   (30.11.2006 в 16:13)
 

Чего делать то..?????

   
 
 автор: coloboc66   (30.11.2006 в 16:53)   письмо автору
 
   для: Diablo_   (30.11.2006 в 16:17)
 

Переехать к другому хостеру с неперегруженным сервером.

   
 
 автор: Axxil   (30.11.2006 в 16:55)   письмо автору
 
   для: Diablo_   (30.11.2006 в 16:17)
 

На коленке:
В конфиге сайта ставим:

<? 
  define
('_CNT',100); // Критическое значение обращений с одного IP
  
$ip $_SERVER['REMOTE_ADDR'];
  
$query mysql_query('DELETE FROM ip_table WHERE last_time>DATE_SUB(NOW(),interval 10 minute)'); // Удаляем ненужные записи старше 10 минут
  
mysql_query('INSERT INTO ip_table SET ip=\''.$ip.'\', last_time=NOW())'); // Записали IP пришедшего
  
$query mysql_query('SELECT count(ip) as cnt FROM ip_table WHERE ip=\''.$ip.'\''); 
  
$r mysql_fetch_assoc($query);
  if(
$r['cnt']>_CNT){
    echo 
"Fuck you fucking spamer"
    exit;
  }  
?>

То же можно на файлах организовать, но медленне будет

   
 
 автор: Diablo_   (30.11.2006 в 17:02)   письмо автору
 
   для: Axxil   (30.11.2006 в 16:55)
 

А где взять этот конфиг?

Я бы переехал, но блин ещё 3 месяца оплачено!

   
 
 автор: Axxil   (30.11.2006 в 17:04)   письмо автору
 
   для: Diablo_   (30.11.2006 в 17:02)
 

Под конфигом я имею ввиду файл который подключается ко всем страницам сайта.

   
 
 автор: Уфимец   (30.11.2006 в 17:05)   письмо автору
 
   для: Axxil   (30.11.2006 в 17:04)
 

Хороший пример исполнения защиты на мой взгляд!

   
 
 автор: Diablo_   (30.11.2006 в 17:35)   письмо автору
 
   для: Уфимец   (30.11.2006 в 17:05)
 

А вообще, у кого-нибудь такое было? Меня хостер заставляет перелопитить все скрипты! плюс к этому ещё и деактивировать хочет! А когда я говорю, что давай тека решайте вы проблему со своим сервером, который лежит 2-3 в неделю, они говорят, что всё гуд!
Но то что нагрузка идёт на сервер, это точно! и большая.

   
 
 автор: Diablo_   (30.11.2006 в 18:30)   письмо автору
 
   для: Diablo_   (30.11.2006 в 17:35)
 

А можно этот код, прописать в index.php? а то у меня конфиг не везде подключается!

   
 
 автор: Unkind   (30.11.2006 в 18:52)   письмо автору
 
   для: Diablo_   (30.11.2006 в 18:30)
 

Тогда уж лучше так:


<?php
//Кол-во максимальных обращений с одного IP за 10 сек.
define("IPCNT"50);

//Блок чистки БД от старых IP-адресов
$ct = (int) file_get_contents("clear");

if(
$ct time())
{
mysql_unbuffered_query("DELETE FROM `ips` WHERE `ts` < ".time().";");
mysql_unbuffered_query("OPTIMIZE TABLE `ips`;");

$fd fopen("clear""w");
flock($fdLOCK_EX);
$puts fputs($fd, (time() + 120)); //Следующая чистка через 120 сек.
flock($fdLOCK_UN);
fclose($fd);
}
//Конец блока чистки БД

//Подсчет запросов с данного IP за последние 10 сек.
$sql mysql_query("SELECT COUNT(*) FROM `ips` WHERE `ip` = INET_ATON('".getenv("REMOTE_ADDR")."') AND `ts` < ".time().");");
//Если за 10 сек. запросов больше, чем разрешено
if(mysql_result($sql0) > IPCNT)
{
//Блокирование через .htaccess
$htaccess $_SERVER['DOCUMENT_ROOT']."/htaccess";
$fd fopen($htaccess"a");
fwrite($fd"Deny from ".getenv("REMOTE_ADDR")."\n");
fclose($fd);

die();
}

//Добавление запроса в базу данных
$sql mysql_query("INSERT INTO `ips` SET `ip` = INET_ATON('".getenv("REMOTE_ADDR")."'), `ts` = ".(time() + 10).";");
?>

   
 
 автор: Diablo_   (30.11.2006 в 21:40)   письмо автору
 
   для: Axxil   (30.11.2006 в 16:55)
 

преобразовал код под себя

  define('_CNT',100); // Критическое значение обращений с одного IP 
  $ip = $_SERVER['REMOTE_ADDR']; 
  $my->sql_query='DELETE FROM ip_table WHERE last_time>DATE_SUB(NOW(),interval 10 minute)'; // Удаляем ненужные записи старше 10 минут 
  $my->sql_execute();
  $my->sql_query='INSERT INTO ip_table SET ip=\''.$ip.'\', last_time=NOW())'; // Записали IP пришедшего 
  $my->sql_execute();
  $my->sql_query='SELECT count(ip) as cnt FROM ip_table WHERE ip=\''.$ip.'\'';  
  $my->sql_execute();
  $r = mysql_fetch_assoc($my->sql_res); 
  if($r['cnt']>_CNT){ 
    echo "Fuck you fucking spamer";  
    exit; 
  }

но чего-то он отказывается работать! (базу создал)

   
 
 автор: Axxil   (30.11.2006 в 21:45)   письмо автору
 
   для: Diablo_   (30.11.2006 в 21:40)
 

А в чём конкретно проблема.
Что не работает?

И чё-то какой-то странный класс $my. Можно его код посмотреть? Если уж делать надстройку над стандартными функциями работы с БД, то надо все эти функции засовывать в методы этого класса. А иначе зачем? :-/
чтобы не было недоразумений типа:
 <? $my->sql_query='SELECT count(ip) as cnt FROM ip_table WHERE ip=\''.$ip.'\'';   
  
$my->sql_execute(); 
  
$r mysql_fetch_assoc($my->sql_res);?> 

   
 
 автор: Diablo_   (30.11.2006 в 21:57)   письмо автору
 
   для: Axxil   (30.11.2006 в 21:45)
 

ошибок не выаёт, но в бд, не добавляет запись!
а класс $my он прописан в отдельном файле!
что нужно показать?

   
 
 автор: Axxil   (30.11.2006 в 22:00)   письмо автору
 
   для: Diablo_   (30.11.2006 в 21:57)
 

БД создана. А таблица создана?

   
 
 автор: Diablo_   (30.11.2006 в 22:06)   письмо автору
 
   для: Axxil   (30.11.2006 в 22:00)
 

да, конечно!

   
 
 автор: Diablo_   (30.11.2006 в 22:19)   письмо автору
 
   для: Diablo_   (30.11.2006 в 22:06)
 

вот, ещё отредактировал! всё вродебы нормально! ошибок нету, но в бд пусто!

  define('_CNT',100); // Критическое значение обращений с одного IP 
  $ip = $_SERVER['REMOTE_ADDR']; 
  $my->sql_query="DELETE FROM ip_table WHERE last_time>DATE_SUB(NOW(),interval 10 minute)"; // Удаляем ненужные записи старше 10 минут 
  $my->sql_execute();
  $my->sql_query="INSERT INTO ip_table SET ip='".$ip."', last_time=NOW())"; // Записали IP пришедшего 
  $my->sql_execute();
  $my->sql_query="SELECT count(ip) as cnt FROM ip_table WHERE ip='".$ip."'";  
  $my->sql_execute();
  $r = mysql_fetch_assoc($my->sql_res); 
  if($r['cnt']>_CNT){ 
    echo "Fuck you fucking spamer";  
    exit; 
  }

а вот код бд

CREATE TABLE `ip_table` (
  `id` int(11) NOT NULL auto_increment,
  `ip` varchar(15) NOT NULL default '',
  `cnt` int(3) NOT NULL default '0',
  `last_time` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

   
 
 автор: Axxil   (30.11.2006 в 22:37)   письмо автору
 
   для: Diablo_   (30.11.2006 в 22:19)
 

Скобка лишняя

my->sql_query="INSERT INTO ip_table SET ip='".$ip."', last_time=NOW())"

cnt - непонятное поле. Зачем оно?

   
 
 автор: Diablo_   (30.11.2006 в 23:07)   письмо автору
 
   для: Axxil   (30.11.2006 в 22:37)
 

Всё, спасибо, работает!
а критическое знчачение 100, это не много ли? и эта сотня. в какой промежуток времени?
чего то блокировка не срабатывает!!! сидел щёлкал, щёлкал, запись в бд обновляется, а банить не хочет!

и ещё одно, а может просто поставить небольшую задержку в начале страницы?
ну наподобие как в C++ (sleep)

   
 
 автор: Axxil   (30.11.2006 в 23:22)   письмо автору
 
   для: Diablo_   (30.11.2006 в 23:07)
 

Ну для теста можно значение с 100 до 10 спустить.
Да и вообще можно поставить 20-30 обращений в минуту одного IP. Уже понятно что качалка.

Ну собственно sleep в php тоже есть и задерживает выполнение скрипта.

   
 
 автор: Diablo_   (30.11.2006 в 23:32)   письмо автору
 
   для: Axxil   (30.11.2006 в 23:22)
 

Так может сделать sleep?
поставил 20 обращений в минуту! протестил, не банит!:(

   
 
 автор: wemd   (01.12.2006 в 00:38)   письмо автору
 
   для: Diablo_   (30.11.2006 в 23:32)
 

Я потестил у себ яэтот кусок от переобращений к скрипту..это не от масс скачки.. для этого есть другая тема.. Меня интересовало только защита от множественных запросов к скрипту без СКЛ и Файловой с. Короче Это можно как-то уменьшить..или усовершенствовать?



=======================================================
$Vremea_pereobrasheniea = 20; // 20 secund
$curtime = time();

$Sleep_pereobrasheniea = 20; // secundi sleepa, esli raskommentirovati i ubrati exit



  if (!isset($_SESSION['pereobrasheniea']))  @session_register('pereobrasheniea');
   if ( ($_SESSION['pereobrasheniea'] == "0") or (!isset($_SESSION['pereobrasheniea']))  )
   {
    $curtime_pere= $curtime+$Vremea_pereobrasheniea;
     $_SESSION['pereobrasheniea']= $curtime_pere;
   }else{
                                              
      $pereobrasheniea_perem = $_SESSION['pereobrasheniea'];
      $curtime_pere_2 = $pereobrasheniea_perem - $curtime ;
if  (($curtime_pere_2 <= $Vremea_pereobrasheniea ) AND ($curtime_pere_2 >= 0) ) {


       $curtime_pere= $curtime+$Vremea_pereobrasheniea;
       $_SESSION['pereobrasheniea']= $curtime_pere;

      /*  sleep($Sleep_pereobrasheniea); */ exit ('NAHUI');   } else {   $_SESSION['pereobrasheniea']= "0"; }
       }

   
 
 автор: XPraptor   (01.12.2006 в 04:09)   письмо автору
 
   для: wemd   (01.12.2006 в 00:38)
 

http://php.spb.ru/other/_dima_noflood.php вот держи и не мучайся.
Я когда то тоже пробывал это, но потом догнал, что как бы не защитил сайт, а роботов поисковых пускать надо. Поэтому нужно в обход защите хранить свежие базы роботовских айпишников и пропускать их, а так сайт навсегда зависнет в конце списка выдачи при поиске.

   
 
 автор: wemd   (01.12.2006 в 12:08)   письмо автору
 
   для: XPraptor   (01.12.2006 в 04:09)
 

$agent_ip= $_SERVER['HTTP_USER_AGENT'];


//PROVERITI NA POISKOVIH BOTOV
$poiskovoi_bot = array("StackRambler", "Googlebot", "Yandex", "Aport", "msnbot", "FAST-WebCrawler", "Slurp/cat", "ASPseek/1.2.10", "CNSearch", "Yahoo", "psbot/0.1", "Rambler", "Mail", "MJ12bot", "TurnitinBot", "Snapbot", "Accoona-AI-Agent", "Jayde Crawler");

  for ($i=0;$i<count($poiskovoi_bot);$i++)   if (strpos($agent_ip,$poiskovoi_bot[$i]))   $actionx=1;

ну и если  $actionx=0, то  баните..

   
 
 автор: Diablo_   (01.12.2006 в 16:12)   письмо автору
 
   для: wemd   (01.12.2006 в 12:08)
 

ну боты то обновляются! ещё головная боль, что бы следить за их обновлениями!

   
 
 автор: wemd   (01.12.2006 в 17:41)   письмо автору
 
   для: Diablo_   (01.12.2006 в 16:12)
 

v logah smotri6i i vse

   
 
 автор: Loki   (01.12.2006 в 17:55)   письмо автору
 
   для: wemd   (01.12.2006 в 17:41)
 

У меня накопилось уже больше трех сотен юзерагентов, которых трудно однозначно идентифицировать... процентов 80 из них - различного рода роботы. Всех будем в массив вносить?:)
Да и опять же: качалки наверняка позволяют ставить любой юзерагент.

   
 
 автор: cheops   (01.12.2006 в 18:05)   письмо автору
 
   для: Loki   (01.12.2006 в 17:55)
 

Среди роботов, кстати, попадаются проверщики, которые смотрят не обманывают ли поисковый робот - если такой робот не найдёт страницы, которые нашёл поисковый робот, то поисковый движок будет считать, что роботам выдаётся одна информация, а людям другая.

   
 
 автор: Diablo_   (01.12.2006 в 18:29)   письмо автору
 
   для: cheops   (01.12.2006 в 18:05)
 

Если честно, то я так и не понял, как решить проблему!
Нужно что ли выбирать? либо юзеры, либо роботы! либо нагрузка на сервер!

   
 
 автор: wemd   (01.12.2006 в 23:08)   письмо автору
 
   для: Loki   (01.12.2006 в 17:55)
 

трех сотен юзерагентов= u menea site bil 450 тиц.. это все юзерагенты которые собрал...

   
 
 автор: Loki   (02.12.2006 в 21:30)   письмо автору
 
   для: wemd   (01.12.2006 в 23:08)
 

А Волга впадает в Каспийское море...

   
 
 автор: Unkind   (02.12.2006 в 21:59)   письмо автору
 
   для: Loki   (02.12.2006 в 21:30)
 

:)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования