Как защитить сайт от тотального скачивания. Статьи. wb0.ru - Все для веб-мастера, on-line сервисы

Как защитить сайт от тотального скачивания

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

У вас есть сайт, на котором, вы публикуете обои для рабочего стола. Общий объем сайта - 500Mb, посещаемость 7 000 хостов в сутки, примерный трафик - 300Гб в месяц или 10 Гб в день.

Добавим к этим посетителям еще 20 человек, скачавших ваш сайт целиком. Получаем увеличение трафика на 10Гб или в два раза. Или другими словами 0.28% посетителей создали 50% трафика. Не совсем честно, особенно если вы оплачиваете трафик.

Способы защиты сайта от скачивания

1. Запрет по User Agent

User Agent - так называются данные, которые каждый броузер передает серверу. Эти данные могут содержать в себе такую информацию, как тип броузера, операционная система, список плагинов и многое другое.

Это наиболее простой, но наименее эффективный способ. Его преимущество в том, что ни кого лишнего вы не запретите, а недостаток в том, что практический каждый Download агент может маскироваться под стандартные браузеры.

Пример:

  1. $agent=" ".$HTTP_USER_AGENT;
  2.  
  3. if (strpos($agent,"DISCo Pump") ||
  4. strpos($agent,"Offline Explorer") ||
  5. strpos($agent,"Teleport") ||
  6. strpos($agent,"WebZIP") ||
  7. strpos($agent,"WebCopier") ||
  8. strpos($agent,"Wget") ||
  9. strpos($agent,"FlashGet") ||
  10. strpos($agent,"CIS TE") ||
  11. strpos($agent,"DTS Agent") ||
  12. strpos($agent,"WebReaper") ||
  13. strpos($agent,"HTTrack") ||
  14. strpos($agent,"Web Downloader")) {
  15. die("Access Denied");
  16. }

2. Ограничение по количеству просмотренных страниц за определенный промежуток времени

Тоже достаточно спорный метод. Но надо понимать, что нормальный человек не может просмотреть 60 страниц за 1 минуту. Но с другой стороны и Download агент может делать паузы между скачиванием страниц.

Даже если вы не заблокируете Download агент совсем, то по крайней мере, сильно затрудните скачивание.

3. Запрет с помощью скрытой ссылки

Наверное, один из самых правильных методов. Вы должны сделать скрытую ссылку на странице, по которой "живой" человек не перейдет, а Download агент и прочие роботы сделают это. IP адрес с которого производится просмотр скрытой страницы блокируется, скажем, на 3 минуты.

Главный недостаток - это то, что вы, таким образом, блокируете поисковых роботов. Бороться с этим можно двумя способами:

  • Проверять $HTTP_USER_AGENT. Для этого вам необходимо будет знать то, каким образом подписываются все поисковые роботы. Кроме того, при таком способе Download агент сможет замаскироваться под поискового робота. (см. пример 2)
  • Запрещать IP адрес можно не по факту загрузки скрытой страницы, а по факту загрузки картинки, установленной на скрытой странице. Поисковые роботы обычно не запрашивают изображения размещенные на страницах, а Download агенты обычно делают это.
Выводы

Как видите, метода, который бы работал на сто процентов, нет, и вам придется что-то (или кого-то) приносить в жертву. Ниже приведен код PHP класса, который реализует защиту от скачивания, описанную в третьем методе.

Пример PHP класса

  1. flooders.inc.php:
  2. <?
  3. class Flooders {
  4. var $filename; /* Имя файла, в котором хранится список */
  5. /* запрещенных IP адресов */
  6.  
  7. var $timeout; /* Время, на которое производится бан IP */
  8. /* адреса. По умолчанию - 600 (10 минут) */
  9.  
  10. var $log; /* Имя лог-файла. */
  11.  
  12. var $AGENTS; /* Массив - список разрешенных агентов */
  13.  
  14. /* */
  15. /* Конструктор - в параметрах можно указать основные настройки */
  16. /* */
  17. /* $filename - имя файла, в котором хранится список */
  18. /* забаненных адресов. */
  19. /* $timeout - время, в секундах, на которое банится IP. */
  20. /* */
  21. /* Пример: $f=new Flooders("ban.txt",3600); */
  22. /* */
  23.  
  24. function Flooders($filename="flooders.txt",$timeout=600) {
  25. $this->filename=$filename;
  26. $this->timeout=$timeout;
  27. $this->AGENTS=Array();
  28. $this->log="";
  29. }
  30.  
  31. /* */
  32. /* Задает имя лог-файла. Если имя файла пустое, то лог-файл */
  33. /* не испольщуется */
  34. /* */
  35.  
  36. function SetLogFileName($filename) {
  37. $this->log=$filename;
  38. }
  39.  
  40. /* */
  41. /* Проверка IP адреса на нахождение в бан-листе. */
  42. /* */
  43. /* Если $http_errror==0, то возвращает true, если IP адрес */
  44. /* забанен, и false, если IP адрес разрешен. */
  45. /* */
  46. /* Если $http_error==404 и IP адрес забанен, то выводится */
  47. /* стандартная страница 404 сервера Apache */
  48. /* */
  49. /* Если $http_error==403 и IP адрес забанен, то выводится */
  50. /* стандартная страница 403 сервера Apache */
  51. /* */
  52.  
  53. function Check($http_error=0) {
  54. GLOBAL $HTTP_SERVER_VARS;
  55.  
  56. $ip1=$HTTP_SERVER_VARS["REMOTE_ADDR"];
  57. $ip2=$HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
  58. $ip1=str_replace(":","_",$ip1);
  59. $ip2=str_replace(":","_",$ip2);
  60.  
  61. $curtime=time();
  62.  
  63. $d=@file($this->filename);
  64. if (!is_array($d)) {print "Ошибка чтения из файла &quot;".$this->filename."&quot;.";return(false);}
  65.  
  66. $found=false;
  67. for ($i=0;$i<count($d);$i++) {
  68. $e=explode(" : ",$d[$i]);
  69. if ($e[1]==$ip1 && trim($e[2])==$ip2 && $e[0]+$this->timeout>$curtime) {$found=true;break;}
  70. }
  71. if ($http_error==404 && $found==true) {
  72. header("HTTP/1.0 404 Not Found");
  73. die("<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">n<HTML><HEAD>n<TITLE>404 Not Found</TITLE>n</HEAD><BODY>n<H1>Not Found</H1>nThe requested URL ".$HTTP_SERVER_VARS["REQUEST_URI"]." was not found on this server.<P>n<HR>n".$HTTP_SERVER_VARS["SERVER_SIGNATURE"]."n</BODY></HTML>");
  74.  
  75. }
  76. if ($http_error==403 && $found==true) {
  77. header("HTTP/1.0 403 Forbidden");
  78. die("<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">n<HTML><HEAD>n<TITLE>403 Forbidden</TITLE>n</HEAD><BODY>n<H1>Forbidden</H1>nYou don't have permission to access ".$HTTP_SERVER_VARS["REQUEST_URI"]."non this server.<P>n<HR>n".$HTTP_SERVER_VARS["SERVER_SIGNATURE"]."n<\/BODY><\/HTML>");
  79. }
  80. return($found);
  81. }
  82.  
  83. /* */
  84. /* Добавления IP адреса в бан-лист */
  85. /* */
  86.  
  87. function Ban() {
  88. GLOBAL $HTTP_SERVER_VARS;
  89.  
  90. $agent=" ".$HTTP_SERVER_VARS["HTTP_USER_AGENT"];
  91. for ($i=0;$i<count($this->AGENTS);$i++) {
  92. if (strpos($agent,$this->AGENTS[$i])) return;
  93. }
  94.  
  95. $ip1=$HTTP_SERVER_VARS["REMOTE_ADDR"];
  96. $ip2=$HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
  97. $ip1=str_replace(":","_",$ip1);
  98. $ip2=str_replace(":","_",$ip2);
  99.  
  100. $curtime=time();
  101.  
  102. $d=@file($this->filename);
  103. if (!is_array($d)) {print "Ошибка чтения из файла &quot;".$this->filename."&quot;.";}
  104.  
  105. for ($i=0;$i<count($d);$i++) {
  106. $e=explode(" : ",$d[$i]);
  107. if ($e[1]==$ip1 && trim($e[2])==$ip2) unset($d[$i]);
  108. }
  109.  
  110. if (need_add) {
  111. if (!empty($this->log)) {
  112. $fw=fopen($this->log,"at");
  113. if ($fw) {
  114. fputs($fw, date("Y-m-d H:i:s")." [".$ip1."|".$ip2."]".$agent."n");
  115. fclose($fw);
  116. }
  117. }
  118. $d[]=$curtime." : ".$ip1." : ".$ip2."n";
  119. }
  120.  
  121. $fw=@fopen($this->filename,"wt");
  122. if (!$fw) {print "Ошибка записи в файла &quot;".$this->filename."&quot;.";return;}
  123.  
  124. foreach ($d as $e) fputs($fw,$e);
  125. fclose($fw);
  126. }
  127.  
  128. function AddAlowAgent($agent) {
  129. $this->AGENTS[]=$agent;
  130. }
  131. }
  132. ?>

Примеры использования

Пример 1

Этот код должен быть установлен на скрытой странице:

  1. <?
  2. include "flooders.inc.php";
  3.  
  4. $f=new Flooders();
  5. $f->Ban();
  6. ?>

Этот код должен быть установлен в верхней части всех страниц сайта:

  1. <?
  2. include "flooders.inc.php";
  3.  
  4. $f=new Flooders();
  5. $f->Check(404);
  6. ?>

Пример 2 - не запрещающий известных поисковых роботов.

Этот код должен быть установлен на скрытой странице:

  1. <?
  2. include "flooders.inc.php";
  3.  
  4. $f=new Flooders("/tmp/ban.txt");
  5. $f->AddAlowAgent("StackRambler");
  6. $f->AddAlowAgent("Googlebot");
  7. $f->AddAlowAgent("Yandex");
  8. $f->AddAlowAgent("Aport");
  9. $f->AddAlowAgent("msnbot");
  10. $f->AddAlowAgent("FAST-WebCrawler");
  11. $f->AddAlowAgent("Slurp/cat");
  12. $f->AddAlowAgent("ASPseek/1.2.10");
  13. $f->AddAlowAgent("CNSearch");
  14. $f->SetLogFileName("/tmp/ban.log");
  15. $f->Ban();
  16. ?>

Этот код должен быть установлен в верхней части всех страниц сайта:

  1. <?
  2. include "flooders.inc.php";
  3.  
  4. $f=new Flooders("/tmp/ban.txt");
  5. $f->Check(403);
  6. ?>

Дата публикации: 07.10.2007
codenet.ru

Статьи по теме:

   Ваш псевдоним:
Ваш комментарий:

Календарь событий


Новости Интернет


Поиск





Последний пересчет

тИЦ:07 Окт 15
PR:09 Дек 13

Наши партнеры

wservices.ru - регистрация доменов, Whois-сервисы Смайлы на все случаи жизни


 
Copyright © 2006-2024, wb0.ru