Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Защита сайта от скачивания

Источник: realcoding.net

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

Приведем простой пример:

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



Похожие статьи:
- Как через форму положить файл на сервер
- Поиграем с PHP - "Поле чудес"
- Модульное программирование на PHP или как написать маленький портал
- JavaScript Selections (работа с выделениями)
- Системы голосований на РНР
- На линии огня
- Регулярные выражения используются для сложного манипулирования строками в PHP
- Чем править фото: 5 бесплатных редакторов
- Битва со списками или применение классов для вывода списков в PHP
- Оптимизация производительности баз данных для Web
- MySQL — “зеленым” админам
- WML - Создание WAP страниц
- Отправка SMS с использованием Интернета


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]