Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11650
Последний выпуск: 19.06.2015

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

(c) 2004 Mike
1 марта 2004 года

Скачать в архиве (~2.4Kb)

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

У вас есть сайт, на котором, вы публикуете обои для рабочего стола. Общий объем сайта - 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 класса, который реализует защиту от скачивания, описанную в третьем методе.

Скачать в архиве (~2.4Kb)


Пример 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 "Ошибка чтения из файла &quot;".$this->filename."&quot;.";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("<!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>");
            }
        if ($http_error==403 && $found==true) {
            header("HTTP/1.0 403 Forbidden");
            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>");
            }
        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 "Ошибка чтения из файла &quot;".$this->filename."&quot;.";}

        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 "Ошибка записи в файла &quot;".$this->filename."&quot;.";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);
?>
[code]
 
Пример 2- не запрещающий известных поисковых роботов.
Этот код должен быть установлен на скрытой странице:
[code=php]
<?
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);
?>

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
+1 / -0
Мне нравитсяМне не нравится
28 апреля 2006, 22:48:39
От роботов легко спастись - все поисковые роботы запрашивают
файл /robots.txt в корне сайта.
В нем можно запретить роботам заходить на страницу-ловушку
2.
Аноним
Мне нравитсяМне не нравится
31 марта 2006, 00:18:13
Немного не понял, как на сайте добавлять ссылки, по которым можно перейти 1 раз например в минуту.
Скрипт не совсем корректно работает: файл ban.txt пустой, а при обращении на страницу testpage выдает ошибку!
3.
Аноним
Мне нравитсяМне не нравится
12 марта 2006, 14:43:50
---
А как быть с поисковиками? Если поисковик будет индексировать ваши страницы и попадет в ловушку? Вам будет весело...
---

А может еще дописать список IP адресов допущенных к полному обращению без флуда и туда вбить IP адреса поисковых роботов.... вопрос. будут не будут ли менятся их адреса и как их узнать... а так статья THE BEST
4.
Аноним
Мне нравитсяМне не нравится
2 марта 2006, 12:36:50
>>Тут я предлагаю определять в начале всех страниц сколько раз это (текущий) пришедший IP за последние скажем 300 секунд открыл страниц и если больше скажем 7, то загнать его на страницу-ловушку со всеми вытекающими из предыдущих мероприятий, приведенных здесь выше.
Если нет спешки (а лишний час роли не играет), то умный злодей сделает рандомные задержки между открытием страниц. Опять же не забывайте такой сценарий (я его часто использую) - к примеру я открыл страницу, на ней внизу десять ссылок типа
<< < 1 2 3 4 5 6 7 8 9 10 > >>
я нажимаю на все десять в опере правой кнопкой и смотрю первую открывшуюся, остальные в это время качаются. Я не обязан сидеть на каждой странице по 15-30 секунд, время-то идет.
5.
Аноним
+1 / -0
Мне нравитсяМне не нравится
26 февраля 2006, 17:20:27
Здравствуйте. Попробовал этот скрипт (третий), и насколько я понял - страничка все-таки скачивается, но пользователь блокируется :(
6.
Аноним
Мне нравитсяМне не нравится
24 февраля 2006, 13:40:42
<blockquote><small>Цитата:<hr size=1>Правда остается опасность, что придут просто случайно 7 чел. из одного диапазона в течении 5 мин и сразу все будут забанены :(

Может кто подскажет как это победить?[/quote]

Тогда пробуй по User-Agent Ну для начала просто посмотри меняет ли он, а уж потом смотри....


7.
Аноним
+1 / -0
Мне нравитсяМне не нравится
7 февраля 2006, 14:52:50
На самом деле этот скрипт создан для устаревших версий PHP.Много массивов для совмещения со старыми версиями (например, $HTTP_SERVER_VARS сейчас $_SERVER (в php5))

Кстати, объектно-ориентированное программирование в PHP5 по сравнению с четвертой версией приняло очень хороший облик.

Предлагаю админам совместно переписать этот же скрипт на PHP5. Будет очень приятно пользоваться новьём. :)
8.
Аноним
Мне нравитсяМне не нравится
2 ноября 2005, 16:55:44
mike - А мой однокашник качнул таки твой сайт без всяких затей сегодня (2.11.2005)Teleportom.

Значит, не работает антифлудер?
9.
Аноним
Мне нравитсяМне не нравится
21 августа 2005, 19:53:18
просто супер статейка
10.
Аноним
Мне нравитсяМне не нравится
29 апреля 2005, 15:08:52
Кстати, довольно удачное решение - использовать переменные не HTTP_GET_VARS, а в сессиях.. Таким же образом можно защитить сайт и от тотальной скачки картинок. Например, картинка показываеца скриптом как <img src="pic.php">, а какая эта картинка определяет "скрытая" переменная в сессии =)
Единственная проблема, с которой можно столкнуца в данном варианте, это то, что иногда значения в сессии не изменяются и можно увидеть предыдущую картинку на месте, где должна быть другая =) Но я думаю это можно легко обойти..
11.
Аноним
Мне нравитсяМне не нравится
14 апреля 2005, 10:07:31
<blockquote><small>Цитата:<hr size=1>
А как быть с поисковиками? Если поисковик будет индексировать ваши страницы и попадет в ловушку? Вам будет весело...
[/quote]
Читаем внимательнее !!!
12.
Аноним
Мне нравитсяМне не нравится
14 апреля 2005, 01:46:22
А как быть с поисковиками? Если поисковик будет индексировать ваши страницы и попадет в ловушку? Вам будет весело...
13.
Аноним
Мне нравитсяМне не нравится
19 сентября 2004, 23:41:01

Цитата:
>В приципе все работает красиво, но остаются
несколько нерешенных вопросов:



В таком случае, лучшее решение - не использовать таких имен файлов, как:

/file/1.htm
/file/2.htm
/file/3.htm
/file/4.htm
...
/file/N.htm

14.
Аноним
Мне нравитсяМне не нравится
18 сентября 2004, 15:26:06
В приципе все работает красиво, но остаются несколько нерешенных вопросов:

1. Как заманить флудера на страницу ловушку если он идет не по ссылкам, а просто перебирает все подряд номера в адресе типа http://site?id=123
Тут я предлагаю определять в начале всех страниц сколько раз это (текущий) пришедший IP за последние скажем 300 секунд открыл страниц и если больше скажем 7, то загнать его на страницу-ловушку со всеми вытекающими из предыдущих мероприятий, приведенных здесь выше.

function antiFlood ( $IP ) {
$sql = "select count(id) from stat where stamp>(now()-300) and IP='$IP'" ;
$res = mysql_query( $sql );
$rec = mysql_fetch_row($res);
$nid=$rec[0] ;
if ( $nid > 7 ) return 1 ;
return 0 ;
}

2. Остается вопрос, как изловить хитреца который заимет диапазо адресов и при каждом обращении ко мне меняет последние три цифры (заметил у себя одного такого).

Тут вроде все просто: эти плавающие последние цифры надо просто отбросить в приведенной функции antiFlood ( $IP ).
Правда остается опасность, что придут просто случайно 7 чел. из одного диапазона в течении 5 мин и сразу все будут забанены :(

Может кто подскажет как это победить?

15.
Аноним
Мне нравитсяМне не нравится
30 июля 2004, 06:26:55
В принципе..
не плохое решение, спасибо
16.
Аноним
Мне нравитсяМне не нравится
19 июня 2004, 22:24:17
Как и чё настраивать? ничего не понимаю..........
17.
Аноним
Мне нравитсяМне не нравится
5 июня 2004, 12:36:11
При недостаточно грамотном подходе CPAN'овский HTML::Parser, навешенный парсером CSS (не таким уж и сложным) прекрасно обойдет "скрытость" ссылки. А вот если выставить "невидимый" стиль j[ava]script'ом, будет интереснее (прийдется к суперумному даунлоадеру припаивать опенсоурсные браузеры вроде Мурзиллы :).
В любом случае метод "скрытых" ссылок плох для облешченных браузеров вроде lynx & links (хотя их вряд ли используют для лазанья по сайтам, требющим подобной защиты :)
18.
Аноним
Мне нравитсяМне не нравится
27 мая 2004, 00:21:28
А точнее можно ??

У меня на трех серверах это дело работает.
19.
Аноним
Мне нравитсяМне не нравится
25 мая 2004, 00:27:38
Помогиите!!!!!!!! Очень полезный и нужный скрипт, но тока чёто он у меня не работает :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог