Web - Защита сайта от скачивания - PRCY⮭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 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);
?>
Information
  • Posted on 27.04.2013 15:41
  • Просмотры: 1084