PHP

Php referer

Что такое Php Referer? Если Вы не знаете, как работает интернет, то напомним, что сначала броузер и сервер обмениваются заголовками - пакетами данных, то есть броузер посылает на сервер запрос по считыванию той или иной странички и к этому запросу прикрепляет ещё пакет данных, сервер отдаёт страничку в формате .html. Так вот, в пакете данных мы находим переменную $_SERVER['HTTP_REFERER'] - в этой переменной лежит страничка, с которой был сделан переход на текущюю. То есть, мы можем сделать скрипт статистики переходов на наш сайт с других сайтов.

Зачем это нужно? Поисковые системы ведут свой рейтинг сайтов, и у них есть так называемый Индекс цитирования, то есть сколько серверов ссылаются на наш сайт. Не будем доверять поисковым системам, а попробуем сами сделать скрипт, который покажет сколько серверов ссылаются на наш сайт, то есть выясним какой на самом деле у нашего сайта ТИЦ.

Итак, поставим задачу.

Если $_SERVER['HTTP_REFERER'] пуст, что бывает в 40% случаев, ничего не делаем. В большинстве случаев, пользователь сам решает оставить ли ему реферер или нет. На некоторых сайтах, например, без него не допускают к просмотру сайта.

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

Если видим, что в реферере есть ненужные сайты, ничего не делаем. К ненужным сайтам можно отнести Поисковики, и те сервера, которые заходя на наш сайт прописывают сами несуществующий реферер с несуществующими страничками (у нас на данный момент таких 30%).

Если первые три пункта ложь, то скачиваем страничку, с которой был переход, если на ней нет ссылки на наш сайт, заносим URL этой странички в ненужные сайты.

Если первые четыре пункта ложь, то ссылка на наш сайт есть на той страничке откуда был переход. Проверяем есть ли такая страничка в базе, если её нет, то мы заносим в базу Ip адрес пользователя, сам адрес странички, плюс счётчик переходов с этого реферера ставим равным одному.

Если страничка, с которой был сделан переход на наш сайт уже есть в базе, то проверяем Ip, если видим, что Ip записанный в базе и нынешнего посетителя совпадают, то ничего не делаем, если они не совпадают, то счётчик переходов по этой странице увеличиваем на один.

Что мы добьёмся выполнив эти условия? Мы будем знать с каких страничек интернета к нам заходят пользователи, плюс счётчик покажет с каких больше, то есть мы узнаем истинный ТИЦ сайта, а не тот, который показыват нам Поисковые системы. Заведём файл ненужных сайтов, которые пытаются навязать нам несуществующие рефереры. Кроме этого, даже если ссылки на наш сайт есть на тех страничках, которые мы занесли в базу ненужных страниц, это означает, что мы не смогли прочитать эти странички. Считывать странички мы будем точно так же, как это делают поисковики, то есть тогда и поисковики не найдут ссылок на наш сайт на этих страничках и их можно считать плохими.

<?php
    // функция разделения URL
function _parse_url ($path) {
preg_match ("~(.+)?:\/\/([ˆ\/]+)([ˆ\?]*)[\?]?([ˆ\/]*)~", $path, $arr);
if ($arr[0]==''){ return array ('path' =>$path); }
return array ('scheme' => $arr[1], 'host' => $arr[2], 'path' => $arr[3], 'query' => $arr[4]);
}
    // функция вывода
function output_r ($path){
$arr = _parse_url($path);
$host = $arr['host'];
if ( !empty ($arr['path'])) $page = $arr['path'];
if ( !empty ($arr['query'])) $query = $arr['query'];
if ( !empty ($query)){$page.='?'.$query;}
if ( empty ($page)){$page='/';}
$fp = @fsockopen ($host, 80, &$errno, &$errstr, 30);
if (!$fp){ return @implode ('', @file ($path)); }
$request = "GET $page HTTP/1.0\r\n";
$request .= "Host: $host\r\n";
$request .= "Accept: text/html, application/xml;q=0.9, */*;q=0.1\r\n";
$request .= "Accept-Charset: windows-1251, utf-8;q=0.6, *;q=0.1\r\n";
$request .= "Accept-Encoding: deflate, gzip, identity, *;q=0\r\n";
$request .= "Accept-Language: ru\r\n";
$request .= "Connection: close\r\n";
$request .= "Keep-Alive: 300\r\n";
$request .= "Expires: Thu, 01 Jan 1970 00:00:01 GMT\r\n";
$request .= "Cache-Control: no-store, no-cache, must-revalidate\r\n";
$request .= "Pragma: no-cache\r\n";
$request .= "Cookie: income=1\r\n";
$request .= "Referer: http://$host/\r\n";
$request .= "User-Agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows 98)\r\n";
$request .= "\r\n";
@fwrite ($fp,$request);
$fest = $out = '';
while ($line = @fgets ($fp, 1024)){
if ( preg_match ("~ˆ[\r]?\n$~i",$line)){$fest='yes';}
elseif ($fest=='yes'){$out .= $line;}
} 
return $out;
}

    // запрос к чужому серверу
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7" ;
$header [] = "Accept: text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5" ;
$header [] = "Accept_charset: windows-1251, utf-8, utf-16;q=0.6, *;q=0.1";
$header [] = "Accept_encoding: identity";
$header [] = "Accept_language: en-us,en;q=0.5";
$header [] = "Connection: close";
$header [] = "Cache-Control: no-store, no-cache, must-revalidate";
$header [] = "Keep_alive: 300";
$header [] = "Expires: Thu, 01 Jan 1970 00:00:01 GMT";

    // функция вывода страники
function _Curl_Page ( $path ) {
global $agent, $header, $referer, $arr_cookie, $cookie_file;
$ch = curl_init ( $path );
@curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
@curl_setopt ( $ch , CURLOPT_VERBOSE , 1 ); 
@curl_setopt ( $ch , CURLOPT_HEADER , 0 );
@curl_setopt ( $ch , CURLOPT_USERAGENT , $agent );
@curl_setopt ( $ch , CURLOPT_REFERER , $referer );
@curl_setopt ( $ch , CURLOPT_HTTPHEADER , $header );
@curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , 1 );
@curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER, 0 );
@curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST, 0 );
$tmp = @curl_exec ( $ch );
curl_close ( $ch ); 
if ($tmp==''){ $tmp = output_r ($path); }
return $tmp;
}

    // функция стирания плохих тегов
function _Delet_teg ($path,$delet){
$search = "~<(".$delet.")[ˆ>]*>(.*)</".$delet."[ˆ>]*>~isU";
return preg_replace ( $search, "", $path ); 
}

    // если нет файла base_referer.dat, создаем его
$base_referer = "base_referer.dat";
if (! @file_exists ($base_referer)){ @touch ($base_referer); }

    // если нет файла base_no_referer.dat, создаем его
$base_no_referer = "base_no_referer.dat";
if (! @file_exists ($base_no_referer)){ @touch ($base_no_referer); }

    // определяем Ip пользователя
$_User_ip = getenv ('REMOTE_ADDR'); 


    // ОСНОВНАЯ ФУНКЦИЯ
function _Activ_ref($path){
global $base_referer, $base_no_referer, $_User_ip;
$_Url_admin = preg_replace ("~ˆ[w]{0,3}[\.]?(.+)~i","\\1",$_SERVER["HTTP_HOST"]);

    # если url самого сайта уходим
if ( preg_match ("~http://[w]{0,3}[\.]?". preg_quote ($_Url_admin,"~")."~i", $path)){ return; }

    # если плохие рефереры просто уходим
$size = filesize ($base_no_referer);
$fp = fopen ( $base_no_referer, "a+" );
$general = fread ( $fp, $size );
fclose ( $fp );
$search_bad = trim ($general);
if ( ! empty ($search_bad)){
$search_bad = "~(". str_replace ("\n","|", preg_quote ($search_bad,"~")).")~is"; 
if ( preg_match ($search_bad, $path)){ return; }
}

    # если в базе реферер есть проверяем ip и увеличиваем
    # счетчик на один, если нет совпадения
$size = filesize ($base_referer);
$fp = fopen ( $base_referer, "a+" );
$general = fread ( $fp, $size );
fclose ( $fp );
$search = "~(". preg_quote ($path,"~").")<>(.+)<>(.+)<>\n~isU";
if ( preg_match ($search, $general, $arr)){
if ($_User_ip != $arr[2]){
$general = preg_replace ($search, "\\1"."<>".$_User_ip."<>".++$arr[3]."<>\n", $general);
$fp = fopen ( $base_referer, "w" );
fwrite ( $fp, $general );
fclose ( $fp ); 
}
return; 
}

    # проверяем есть ли наш url на странице перехода
$search_my_url = "~<[Aa][ \r\n\t]{1}[ˆ>]*[Hh][Rr][Ee][Ff][ˆ=]*=[ '\"\n\r\t]*(http://(|[w\.]{4})". preg_quote ($_Url_admin,"~").")[ˆ>]*>.+</[Aa]>~is";
$pagess = _Delet_teg (_Curl_Page ( $path ), "noindex");
if ( preg_match ($search_my_url, $pagess)){
$general .= $path."<>".$_User_ip."<>1<>\n";
$fp = fopen ( $base_referer, "w" );
fwrite ( $fp, $general );
fclose ( $fp ); 
return; 
} 

    # если нет, пишем нарушителя в базу с плохими серверарми
else {
print 5;
$ARR = _parse_url ($path);
$size = filesize ($base_no_referer);
$fp = fopen ( $base_no_referer, "a+" );
$general = fread ( $fp, $size );
fclose ( $fp );
if ( ! empty ($ARR["host"])){ 
if ( preg_match ("~\.[a-z]{2,3}~i",$ARR["host"])){
$general .= $ARR["host"]."\n";
$fp = fopen ( $base_no_referer, "w" );
fwrite ( $fp, $general );
fclose ( $fp );
}
} 
} 
}

    // применим функцию
if ( ! empty ($_SERVER['HTTP_REFERER'])) { _Activ_ref ($_SERVER['HTTP_REFERER']); }

    // вывод
print "
<br><a href='?baza=1'>смотреть, что записалось в базу...</a>
<br><br>";

if ( ! empty ($_GET['baza'])){

$size = filesize ($base_referer);
$fp = fopen ( $base_referer, "r" );
$general = fread ( $fp, $size );
fclose ( $fp );
print "<pre>";
print $general;
print "</pre>";

$size = filesize ($base_no_referer);
$fp = fopen ( $base_no_referer, "r" );
$general = fread ( $fp, $size );
fclose ( $fp );
print "<pre>";
print $general;
print "</pre>";

}
?>

Из этого скрипта видно всё то, что мы поставили в задаче, выполнено. Здесь Вы видите функцию _Curl_Page() - эта функция по считыванию страничек интернета. Она в архиве есть, скачайте архив и установите себе...

Посмотреть работу скрипта можно здесь. Сделайте так, чтобы Реферер у Вас работал, зайдите на любую из страниц, которые там указаны в списке. Зайдите на любой ссылающийся на нас сайт, найдите ссылку на наш сайт и перейдите по ней, потом перезагрузите страницу статистики. Вы увидите свой Ip и, что количество кликов увеличилось на один.
Теги:
referer
Добавлено: 02 Апреля 2018 20:54:27 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...