Бывают такие случаи, когда владелец сайта не желает, или не может, отдавать свой сайт целиком своим посетителями. Как это сделать? Приведем простой пример: У вас есть сайт, на котором, вы публикуете обои для рабочего стола. Общий объем сайта - 500mb, посещаемость 7 000 хостов в сутки, примерный трафик - 300Гб в месяц или 10 Гб в день. Добавим к этим посетителям еще 20 человек, скачавших ваш сайт целиком. Получаем увеличение трафика на 10Гб или в два раза. Или другими словами 0.28% посетителей создали 50% трафика. Не совсем честно, особенно если вы оплачиваете трафик. Способы защиты сайта от скачивания 1. Запрет по user agent user agent - так называются данные, которые каждый броузер передает серверу. Эти данные могут содержать в себе такую информацию, как тип броузера, операционная система, список плагинов и многое другое. Это наиболее простой, но наименее эффективный способ. Его преимущество в том, что ни кого лишнего вы не запретите, а недостаток в том, что практический каждый download агент может маскироваться под стандартные браузеры. Пример: $agent=" ".$http_user_agent; if (strpos($agent,"disco pump") || strpos($agent,"offline explorer") || strpos($agent,"teleport") || strpos($agent,"webzip") || strpos($agent,"webcopier") || strpos($agent,"wget") || strpos($agent,"flashget") || strpos($agent,"cis te") || strpos($agent,"dts agent") || strpos($agent,"webreaper") || strpos($agent,"httrack") || strpos($agent,"web downloader")) { die("access denied"); } 2. Ограничение по количеству просмотренных страниц за определенный промежуток времени. Тоже достаточно спорный метод. Но надо понимать, что нормальный человек не может просмотреть 60 страниц за 1 минуту. Но с другой стороны и download агент может делать паузы между скачиванием страниц. Даже если вы не заблокируете download агент совсем, то по крайней мере, сильно затрудните скачивание. 3. Запрет с помощью скрытой ссылки. Наверное, один из самых правильных методов. Вы должны сделать скрытую ссылку на странице, по которой "живой" человек не перейдет, а download агент и прочие роботы сделают это. ip адрес с которого производится просмотр скрытой страницы блокируется, скажем, на 3 минуты. Главный недостаток - это то, что вы, таким образом, блокируете поисковых роботов. Бороться с этим можно двумя способами: * Проверять $http_user_agent. Для этого вам необходимо будет знать то, каким образом подписываются все поисковые роботы. Кроме того, при таком способе download агент сможет замаскироваться под поискового робота. (см. пример 2) * Запрещать ip адрес можно не по факту загрузки скрытой страницы, а по факту загрузки картинки, установленной на скрытой странице. Поисковые роботы обычно не запрашивают изображения размещенные на страницах, а download агенты обычно делают это. Выводы. Как видите, метода, который бы работал на сто процентов, нет, и вам придется что-то (или кого-то) приносить в жертву. Ниже приведен код php класса, который реализует защиту от скачивания, описанную в третьем методе. flooders.inc.php: class flooders { var $filename; /* Имя файла, в котором хранится список */ /* запрещенных ip адресов */ var $timeout; /* Время, на которое производится бан ip */ /* адреса. По умолчанию - 600 (10 минут) */ var $log; /* Имя лог-файла. */ var $agents; /* Массив - список разрешенных агентов */ /* */ /* Конструктор - в параметрах можно указать основные настройки */ /* */ /* $filename - имя файла, в котором хранится список */ /* забаненных адресов. */ /* $timeout - время, в секундах, на которое банится ip. */ /* */ /* Пример: $f=new flooders("ban.txt",3600); */ /* */ function flooders($filename="flooders.txt",$timeout=600) { $this->filename=$filename; $this->timeout=$timeout; $this->agents=array(); $this->log=""; } /* */ /* Задает имя лог-файла. Если имя файла пустое, то лог-файл */ /* не испольщуется */ /* */ function setlogfilename($filename) { $this->log=$filename; } /* */ /* Проверка ip адреса на нахождение в бан-листе. */ /* */ /* Если $http_errror==0, то возвращает true, если ip адрес */ /* забанен, и false, если ip адрес разрешен. */ /* */ /* Если $http_error==404 и ip адрес забанен, то выводится */ /* стандартная страница 404 сервера apache */ /* */ /* Если $http_error==403 и ip адрес забанен, то выводится */ /* стандартная страница 403 сервера apache */ /* */ function check($http_error=0) { global $http_server_vars; $ip1=$http_server_vars["remote_addr"]; $ip2=$http_server_vars["http_x_forwarded_for"]; $ip1=str_replace(":","_",$ip1); $ip2=str_replace(":","_",$ip2); $curtime=time(); $d=@file($this->filename); if (!is_array($d)) {print "Ошибка чтения из файла "".$this->filename."".";return(false);} $found=false; for ($i=0;$i<count($d);$i++) { $e=explode(" : ",$d[$i]); if ($e[1]==$ip1 && trim($e[2])==$ip2 && $e[0]+$this->timeout>$curtime) {$found=true;break;} } if ($http_error==404 && $found==true) { header("http/1.0 404 not found"); die("nnnn not found nthe requested url ".$http_server_vars["request_uri"]." was not found on this server. n -------------------------------------------------------------------------------- n".$http_server_vars["server_signature"]."n"); } if ($http_error==403 && $found==true) { header("http/1.0 403 forbidden"); die("nnnn forbidden nyou don't have permission to access ".$http_server_vars["request_uri"]."non this server. n -------------------------------------------------------------------------------- n".$http_server_vars["server_signature"]."n"); } return($found); } /* */ /* Добавления ip адреса в бан-лист */ /* */ function ban() { global $http_server_vars; $agent=" ".$http_server_vars["http_user_agent"]; for ($i=0;$i<count($this->agents);$i++) { if (strpos($agent,$this->agents[$i])) return; } $ip1=$http_server_vars["remote_addr"]; $ip2=$http_server_vars["http_x_forwarded_for"]; $ip1=str_replace(":","_",$ip1); $ip2=str_replace(":","_",$ip2); $curtime=time(); $d=@file($this->filename); if (!is_array($d)) {print "Ошибка чтения из файла "".$this->filename."".";} for ($i=0;$i<count($d);$i++) { $e=explode(" : ",$d[$i]); if ($e[1]==$ip1 && trim($e[2])==$ip2) unset($d[$i]); } if (need_add) { if (!empty($this->log)) { $fw=fopen($this->log,"at"); if ($fw) { fputs($fw, date("y-m-d h:i:s")." [".$ip1."|".$ip2."]".$agent."n"); fclose($fw); } } $d[]=$curtime." : ".$ip1." : ".$ip2."n"; } $fw=@fopen($this->filename,"wt"); if (!$fw) {print "Ошибка записи в файла "".$this->filename."".";return;} foreach ($d as $e) fputs($fw,$e); fclose($fw); } function addalowagent($agent) { $this->agents[]=$agent; } } ?> -------------------------------------------------------------------------------- Примеры использования Пример 1 Этот код должен быть установлен на скрытой странице: include "flooders.inc.php"; $f=new flooders(); $f->ban(); ?> Этот код должен быть установлен в верхней части всех страниц сайта: include "flooders.inc.php"; $f=new flooders(); $f->check(404); ?> Пример 2 - не запрещающий известных поисковых роботов. Этот код должен быть установлен на скрытой странице: include "flooders.inc.php"; $f=new flooders("/tmp/ban.txt"); $f->addalowagent("stackrambler"); $f->addalowagent("googlebot"); $f->addalowagent("yandex"); $f->addalowagent("aport"); $f->addalowagent("msnbot"); $f->addalowagent("fast-webcrawler"); $f->addalowagent("slurp/cat"); $f->addalowagent("aspseek/1.2.10"); $f->addalowagent("cnsearch"); $f->setlogfilename("/tmp/ban.log"); $f->ban(); ?> Этот код должен быть установлен в верхней части всех страниц сайта: include "flooders.inc.php"; $f=new flooders("/tmp/ban.txt"); $f->check(403); ?>
|