Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Старая тема по REFERER (для Дизайнера)
 
 автор: Valeri   (12.03.2005 в 11:45)   письмо автору
 
 

Да прстят меня админы, но что-то в этой суете забылась эта тема, а так ведь и не договорили, а все таки мне это интересно.
Сейчас получается 2 вопроса
1. при таком переходе

<META HTTP-EQUIV='Refresh' CONTENT='0; URL=$url'>

можно передать HTTP_REFERER, что бы она определилась на сайте $url ?
2. так как все таки можно ее подменить ?
В прошлый раз остановились на том, что если использовать фрейм, то подменить ее нельзя, а если не использовать фрейм ?

   
 
 автор: glsv (Дизайнер)   (12.03.2005 в 14:10)   письмо автору
 
   для: Valeri   (12.03.2005 в 11:45)
 

Хм.. да, тогда так и не смогли найти решение.
А вы говорили, что есть некая система, позволяющая это сделать. Дайте, пожалуйста, ссылку, где можно про нее почитать.

   
 
 автор: Valeri   (12.03.2005 в 14:36)   письмо автору
 
   для: glsv (Дизайнер)   (12.03.2005 в 14:10)
 

Уважаемый Дизайнер насчет системы Вы немного не так поняли, Система Активной Раскрукти (САР) - это общее название сайтов занимающихся раскруткой других сайтов. Вот к примеру адрес одной из них
http://www.uniq-ip.com
таких систем много, но суть у них одна.
У них в акке стоит функция, когда забиваешь свой сайт для раскрутки "Передавать HTTP_REFERER", то есть если ставишь галочку то реферер передается, если нет, то не передается. Для каких это целей используется я здесь обьяснять не буду.
Но как было сказно выше, затереть реферер не сложно.
Поэтому в принцыпе этот вопрос решен.
Но остается открытым вопрос с подменой.
Давненько на одном из форумов, не помню сейчас на каком, вовеб, вебскриптс или еще на каком-то посвещенном ПХП был примерно такой вопрос "Как узнать откуда пришел посетитель ?" ну в основном для того что бы если вдруг ломать начнут то узнать откуда и чего, и соответственно ответ по поводу реферер, но не это главное, там было сказано, что доверять этой переменной нельзя, так как подменить ее проще простого, особено если делать приход через свой хост, то есть практически используя скрипт ее можно послать любую. Тогда меня это не интересовало и я особого внимания не заострял.
Вообще насколько я понимаю она передается в заголовке, тогда надо как то ее вставить в заголовок, так по идеи получается ?
В общем все сводится к тому, что наверняка решение очень простое, так сказать в одну строку, но .......... :(

   
 
 автор: glsv (Дизайнер)   (13.03.2005 в 01:47)   письмо автору
 
   для: Valeri   (12.03.2005 в 14:36)
 

Хм… все же я не знаю такого способа. HTTP_REFERER формируется браузером.
Любой посетитель, в принципе, может подменить HTTP_REFERER, так как посылается он именно с его стороны. Можно поставить прокси-сервер, обрезающий заголовки, пользоваться специальным браузером.
Но я не вижу способа это сделать вам, как web-разработчику. Вы по другую сторону находитесь. Нужно дать указание браузеру подменить HTTP_REFERER. Но как это сделать и с помощью чего я не знаю.

   
 
 автор: Valeri   (13.03.2005 в 04:22)   письмо автору
 
   для: glsv (Дизайнер)   (13.03.2005 в 01:47)
 

но в таком случае надо сразу посылать браузеру подмененную реферер.
вообще как на сервере она формируется ?

   
 
 автор: Valeri   (13.03.2005 в 05:17)   письмо автору
 
   для: Valeri   (13.03.2005 в 04:22)
 

вооо, вспонил еще одну тему поэтому вопросу, не помню, что там было и как точно, но суть сводилась к следуещему, что REFERER отсылаемая сервером подменяется через .htaccess и было прописано как это сделать.
я по .htaccess не особо, если кто в этом хорошо соображает, то может эта наводка поможет найти решение.

   
 
 автор: glsv (Дизайнер)   (13.03.2005 в 19:45)   письмо автору
 
   для: Valeri   (13.03.2005 в 04:22)
 

В тот то и проблема, что формируется она браузером, а не сервером.
А значит .htaccess и прочие серверные технологии уже не работают.
Вот перевод спецификации HTTP-протокола.

Поле заголовка запроса Referer позволяет клиенту специфицировать (для пользы сервера) адрес (URI) ресурса, из которого был получен Request-URI.


PS: Проверка HTTP_REFERER в .htaccess чаще всего используется, как одна из ступеней защиты.

   
 
 автор: Valeri   (13.03.2005 в 21:13)   письмо автору
 
   для: glsv (Дизайнер)   (13.03.2005 в 19:45)
 

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

   
 
 автор: glsv (Дизайнер)   (14.03.2005 в 00:33)   письмо автору
 
   для: Valeri   (13.03.2005 в 21:13)
 

Да, скрипт может отослать заголовки, но теряет смысл исходная задача.
Упрощенно: Взять страницу с чужого сайта, подключить ее в свое сайт и изменить реферер.
Ведь посетители будут просматривать именно страницу чужого сайта, а не ваш скрипт. И реферер отсылается браузерами посетителей. И ссылки, которые нажимают посетители будут находится на чужой странице, а не на вашем скрипте.

   
 
 автор: Valeri   (14.03.2005 в 02:01)   письмо автору
 
   для: glsv (Дизайнер)   (14.03.2005 в 00:33)
 

извините, не понял ? если можно поподробнее о том, что Вы имели ввиду.
может мы уже понакрутили и немного так сказать полезли в дебри и отошли от первоочередной задачи.
вопрос стоял так - "как сделать что-бы пользователь щелкнувший по ссылке на одном сайте (назовем его №1) и пришедший на сайт №2, на сайте №2 определися пришедшим с сайта №3"

   
 
 автор: glsv (Дизайнер)   (14.03.2005 в 08:58)   письмо автору
 
   для: Valeri   (14.03.2005 в 02:01)
 

>вопрос стоял так - "как сделать что-бы пользователь щелкнувший по ссылке на одном сайте (назовем его №1) и пришедший на сайт №2, на сайте №2 определися пришедшим с сайта №3"
А вот смотрите. Cheops привел скрипт, которые обращается при помощи сокетов на некий сайт. Как вы сможете вызвать этот скрипт если посетитель нажал на обычную ссылку вида <a href="">Ссылка</a> ссылку на сайте №1.
Насколько я понял, вы не можете изменить эту ссылку (эта ссылка ведет на сайт №2).

   
 
 автор: Valeri   (14.03.2005 в 09:34)   письмо автору
 
   для: glsv (Дизайнер)   (14.03.2005 в 08:58)
 

нет, вопрос сиоял немного не так, или я не првильно его поставил, что Вы не поняли
пользователь щелкает на ссылку такого типа

<a href="count.php?url=http://..." target=_blank>Партнер 1</a>

переходит на страницу count.php которая открывается в новом окне
страница count.php

<?
// идет запись в БД что такой-то прошел по такой-то ссылке 
//и отправляем его по ссылке
echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=$_GET['$url']'>";
?>

и вопрос стоял как при таком переходе отослать REFERER, так как в этом случае она теряется. Ну а если есть решение как ее отослать, то практически не важно какую ее посылать, настоящею или плдменную.
Сейчас как я понимаю страница count.php будет выглядить вот так

<?
// идет запись в БД что такой-то прошел по такой-то ссылке 
//и отправляем его по ссылке
//только я подумал, что лучше ссылку вытаскивать из БД по ее id и ссылка на сайте
// будет выглядить так
// <a href="count.php?id=1" target=_blank">Партнер 1</a>
// достем $url из БД
// не особо пока понял как ее разбить на 2 переменные к примеру $url1 и $url2
$fp fsockopen("$url1"80$errno$errstr30); 
  if (!
$fp
  { 
    echo 
"$errstr ($errno)<br />\n"
  } else { 
    
$out "GET /$url2 HTTP/1.1\r\n"
    
$out .= "Host: $url1\r\n"
    
$out .= "Referer: www.google.ru\r\n"
    
$out .= "Connection: Close\r\n\r\n"
    
$bufer ""
    
fwrite($fp$out); 
    while (!
feof($fp)) { 
       
$bufer .= fgets($fp4096); 
    } 
    
fclose($fp); 
  } 
  echo 
$bufer

?>

Правильно я понял как должна выглядить страница count.php ?

   
 
 автор: cheops   (14.03.2005 в 09:36)   письмо автору
 
   для: Valeri   (14.03.2005 в 09:34)
 

Только вместо www.google.ru поставьте пустую строку или что-то вроде none :)))

   
 
 автор: glsv (Дизайнер)   (14.03.2005 в 09:43)   письмо автору
 
   для: Valeri   (14.03.2005 в 09:34)
 

>нет, вопрос сиоял немного не так
Да, мы уже запутались :) Я считал, что ссылки не ваши и вы не можете указать на свой скрипт.

   
 
 автор: Valeri   (14.03.2005 в 09:56)   письмо автору
 
   для: glsv (Дизайнер)   (14.03.2005 в 09:43)
 

я же уже говорил, что мы куда-то улезли в дебри а ответ на поверхности :)
теперь все встало на свои места.
Хеопс конечно я не буду оставлять google :)
если бы Вы еще подписали как правильно разбить ссылку в том что я написал в файле count.php, то это вообще было бы здорово.
после обеда попробую протестить все это хозяйство :)

   
 
 автор: cheops   (14.03.2005 в 10:12)   письмо автору
 
   для: Valeri   (14.03.2005 в 09:56)
 

В вашем случае код должен выглядеть примерно следующим образом
<?php
$str
="http://www.site.ru/index.php"
$arr parse_url($str);
$url1 $arr['host']
$url2 $arr['path']
?>

Следует заметить, что у $url2 уже будет слешь, поэтому из кода его следует убрать.

   
 
 автор: Valeri   (14.03.2005 в 14:23)   письмо автору
 
   для: cheops   (14.03.2005 в 10:12)
 

что-то не то получается :(
ссылка вот такого типа
http://site.ru/?ind=22222
и вот такого типа
http://site.ru/nm.htm?id=3333
насколько я понимаю ссылка должна бится на 3 параметра
$url = $arr['host'];
$url2 = $arr['path'];
$url3 = $arr['query'];
а вот не получается вставить 3 параметр в

<?
else { 
    
$out "GET $url2 HTTP/1.1\r\n";
    
$out .= "Host: $url\r\n"
    
$out .= "Referer: $site_link\r\n"
    
$out .= "Connection: Close\r\n\r\n"
?>

как только не пробовал его вставлять, не работает :(
усли в ссылке отсечь 3 параметр то тогда REFERER определяется

   
 
 автор: Valeri   (14.03.2005 в 17:27)   письмо автору
 
   для: Valeri   (14.03.2005 в 14:23)
 

еще вот такой момент, посмотрел хтмл код страницы куда приходишь по партнерке, вот там один скриптик интересный, как я понимаю они что то проверяют и сравнивают, как вообще его можно прочитать ?

<script>
o='empty';
pop='empty';
r=escape(document.referrer);
w=screen.width;
h=screen.height;
c=(screen.colorDepth?screen.colorDepth:screen.pixelDepth);
u=escape(document.URL);
if(opener && !r){o=escape(opener.location.href);}
document.write('<img src="http://site.ru/hit.php?r='+r+'&w='+w+'&h='+h+'&c='+c+'&u='+u+'&o='+o+'&p='+22222+'&pop='+pop+'" width=1 height=1>');

    if (self.parent.frames.length != 0)
    if (self.parent.location != document.location)
    {self.parent.location=document.location};
               
    window.top.moveTo(0,0);
    window.top.resizeTo(screen.availWidth,screen.availHeight);
               
</script>

   
 
 автор: cheops   (14.03.2005 в 22:49)   письмо автору
 
   для: Valeri   (14.03.2005 в 14:23)
 

Дело в том, что на месте $url2, должно стоять /nm.htm?id=3333, т.е. параметры тоже необходимо указывать.

   
 
 автор: Valeri   (15.03.2005 в 00:26)   письмо автору
 
   для: cheops   (14.03.2005 в 22:49)
 

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

<? 
else { 
    
$out "GET $url2?$url3 HTTP/1.1\r\n"
    
$out .= "Host: $url\r\n"
    
$out .= "Referer: $site\r\n"
    
$out .= "Connection: Close\r\n\r\n"
?>

то параметры проходят, но REFERER не определяется.
Как правильно их прилепить ?
какой вообще синтаксис ?
а если ссылка будет http://site.ru/ffff/kkkkk/file.php
как писатьть ?

   
 
 автор: cheops   (14.03.2005 в 02:21)   письмо автору
 
   для: Valeri   (13.03.2005 в 21:13)
 

Можно. Вообще вся иммитация действий клиента на сервере осуществляется при помощи сокетов, так следующий код запрашивает хост www.site.ru/get.php и приходит туда как клиент с реферером www.google.ru
<?php 
  $fp 
fsockopen("www.site.ru"80$errno$errstr30); 
  if (!
$fp
  { 
    echo 
"$errstr ($errno)<br />\n"
  } else { 
    
$out "GET /get.php HTTP/1.1\r\n"
    
$out .= "Host: www.site.ru\r\n"
    
$out .= "Referer: www.google.ru\r\n"
    
$out .= "Connection: Close\r\n\r\n"
    
$bufer ""
    
fwrite($fp$out); 
    while (!
feof($fp)) { 
       
$bufer .= fgets($fp4096); 
    } 
    
fclose($fp); 
  } 
  echo 
$bufer
?>

   
 
 автор: Valeri   (14.03.2005 в 04:26)   письмо автору
 
   для: cheops   (14.03.2005 в 02:21)
 

спасибо, попробую на хосте потестю, хотя на локале такой вариант не прошел
пишит что не может найти 80 порт.
или на локале это не должно работать ?
и еще, не могли бы вы обьяснить чьто такое $errno, $errstr, 30 и 4096, что бы понять как это работает, а не просто скопировал и ладно.

   
 
 автор: Valeri   (14.03.2005 в 08:06)   письмо автору
 
   для: Valeri   (14.03.2005 в 04:26)
 

и еще один вопросик, может конечно он не в тему, тогда перенесите куда посчитаете нужным
как разбить ссылку ?
тоесть если из БД достается ссылка такого типа
www.site.ru/get.php
то как ее разбить на
www.site.ru и get.php
так как у Вас написано, то она должна быть в таком формате или ее можно не бить ?

   
 
 автор: cheops   (14.03.2005 в 09:21)   письмо автору
 
   для: Valeri   (14.03.2005 в 08:06)
 

Для этого можно воспользоваться функцией parse_url(), которая потрошит URL на части
<?php
  $arr 
parse_url("http://www.site.ru/get.php");
  
print_r($arr);
?>

   
 
 автор: glsv (Дизайнер)   (14.03.2005 в 09:27)   письмо автору
 
   для: Valeri   (14.03.2005 в 08:06)
 

Для анализа URL и его разбивки можно использовать функцию parse_url()
Вот такой код:

<?
$str
="http://www.site.ru/index.php?id=3&tg=4";
echo 
"<pre>";
print_r(parse_url($str));
echo 
"</pre>";
?>

Выдаст

Array
(
    [scheme] => http
    [host] => www.site.ru
    [path] => /index.php
    [query] => id=3&tg=4
)


http://www.softtime.ru/dic/id_dic=272&id_group=10

   
 
 автор: cheops   (14.03.2005 в 09:18)   письмо автору
 
   для: Valeri   (14.03.2005 в 04:26)
 

Обратиться к другому сайту с локальной машины можно - какая версия PHP стоит у вас? $errno, $errstr - это ссылки на номер и текст ошибки, если функция заканчивается неудачно - их можно вывести в окно браузера и посмотреть в чём дело. 30 - максимальное число секунд ожидания ответа от сервера, 4096 - число байт запрашиваемое от сервера, так как нельзя сразу утянуть несколько десятков килобайт, так как это не локальный файл, а сетевой адрес, поэтому мы в цикле вытягиваем его по 4 Кб за один цикл, можно уменьшить или увеличить эту цифру в зависимости от того, какое соединение используется для доступа в Internet.

PS На ряде хостингов, особенно бесплатных такое удалённое обращение к хостам запрещается.

   
 
 автор: Valeri   (15.03.2005 в 13:17)   письмо автору
 
   для: cheops   (14.03.2005 в 09:18)
 

как не прискорбно, но вариант с сокетами оказался не решением вопроса :(
вот ряд причин.
1. ссылки на просматриваемом сайте становятся такого типа

http://мой сайт/ссылка

то есть дальше загруженной страницы просмотр не возможен
2. вверху загружаемой страницы выводится
HTTP/1.1 200 OK Date: Tue, 15 Mar 2005 09:52:38 GMT Server: Apache/1.3.31 (Unix) Set-Cookie: uid=QubiK0I2sGYAAPtTAwMPAg==; path=/; domain=.; expires=Sun, 15-Mar-15 21:52:38 GMT Last-Modified: Tue, 15 Mar 2005 08:17:30 GMT ETag: "34fbbc-3cbe-42369a1a" Accept-Ranges: bytes Content-Length: 15550 Connection: close Content-Type: text/html
а на одном сайте вывело еще и кучу ошибок примерно такого типа
Warning: Cannot modify header information - headers already sent by (output started at /home/site/public_html/includes/data/config.php:72) in /home/site/public_html/header.php on line 33
e4
Warning: Cannot modify header information - headers already sent by (output started at /home/site/public_html/includes/data/config.php:72) in /home/site/public_html/header.php on line 34
1 7 7 4b 28 2f 2c 2a 43 63 4c 2d 2d 27 30 4c c 90 19c

3. не загружаются картинки на просматриваемый сайт
Вот такие проблемы.
Так есть все таки решение или нет ???

   
 
 автор: cheops   (15.03.2005 в 13:36)   письмо автору
 
   для: Valeri   (15.03.2005 в 13:17)
 

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

   
 
 автор: Valeri   (15.03.2005 в 13:49)   письмо автору
 
   для: cheops   (15.03.2005 в 13:36)
 

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

   
 
 автор: cheops   (15.03.2005 в 14:57)   письмо автору
 
   для: Valeri   (15.03.2005 в 13:49)
 

Пользователи на вашей стороне? Может быть дешевле привлечь их на свою сторону и объяснить как избавится от Referer?

   
 
 автор: Valeri   (15.03.2005 в 15:15)   письмо автору
 
   для: cheops   (15.03.2005 в 14:57)
 

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

   
 
 автор: cheops   (15.03.2005 в 16:46)   письмо автору
 
   для: Valeri   (15.03.2005 в 15:15)
 

В Internet Explorer я такой возможности так и не смог обнаружить, ряд других браузеров это легко позволяют сделать, например, Opera: Tools->Preferences->Privacy снять галку Enable Referrer Logging (путь доступа к этой панели отличается от версии к версии).

   
 
 автор: Valeri   (15.03.2005 в 16:55)   письмо автору
 
   для: cheops   (15.03.2005 в 16:46)
 

ну насколько я понимаю это опять отключение передачи реферер, а это не то что надо.
а потом большинство пользуются IE
самое обидное, 100% известно что можно сделать то что мне надо
но вот как ?

   
 
 автор: Valeri   (20.03.2005 в 04:52)   письмо автору
 
   для: Valeri   (15.03.2005 в 16:55)
 

так никто ничего и не сможет предложить по этой проблеме ?

   
 
 автор: glsv (Дизайнер)   (21.03.2005 в 00:35)   письмо автору
 
   для: Valeri   (20.03.2005 в 04:52)
 

Хм... видимо нет.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования