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

Форум PHP

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

 

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

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

тема: HTTP заголовки, эмуляция браузера
 
 автор: deman-b   (25.07.2007 в 20:52)   письмо автору
 
 

плиз дайте мне ман по этой теме...
или ещо лутше приведите пример правельных заголовков
вот что то вроде таких..


POST /login.php HTTP/1.1
Host: http://anysite.ru
Content-type: application/x-www-form-urlencoded
Content-Length: 74
username=LOGIN&password=03080308&login=PASS


и как работать с ними через ПХП (с сокетами)
т.е. превидите пример правельного построения заголовков и полной эмуляции браузера..

.. я пробовал отправить данные через сокеты методом POST - выдает ошибку 400 ... хотя взвешивыю длинну POST переменных правильно..
заранее спасибо..

   
 
 автор: cheops   (26.07.2007 в 11:13)   письмо автору
 
   для: deman-b   (25.07.2007 в 20:52)
 

Возможно вас заинтересуют темы по ссылкам
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1879
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9050
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8931

   
 
 автор: amigo62   (27.07.2007 в 17:13)   письмо автору
 
   для: cheops   (26.07.2007 в 11:13)
 

Огромное спасибо за подборку топиков и компетентные ответы, мануалы на подобную тему практически невозможно найти в сети. Многое для себя прояснил, однако кое-что все еще непонятно. Во-первых, если я не ошибаюсь, везде чтение ответов сервера ограничено последним аргументом функции fgets();, чаще всего до 1kb. Как принять весь контент, отправленный в ответ на текущий запрос?
Во-вторых, вопрос подмены IP- как же все-таки заставить скрипт отправлять запросы через прокси?
и, в-третьих, можно ли эмулировать с помощью fsockopen и ее друзей отправку UPLOAD-формы?
P.S. хотел еще спросить, как отделить полученые заголовки от html, но, кажется сам понял- по \r\n\r\n =)

   
 
 автор: Trianon   (27.07.2007 в 17:50)   письмо автору
 
   для: amigo62   (27.07.2007 в 17:13)
 

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


всё это можно делать. и аплоады и обмен через прокси и всё остальное.

Но нужно отдавать себе отчет в том, что HTTP-протокол, особенно его версия 1.1 - совсем не такой простой, как кажется на первый взгляд.
Поэтому альтернатива в виде применения библиотеки CURL обычно оказывается более надежным и устойчивым методом межсерверной коммуникации, нежели fsockopen и иже с ним.

   
 
 автор: amigo62   (27.07.2007 в 18:24)   письмо автору
 
   для: cheops   (26.07.2007 в 11:13)
 

Мм, и все-таки? Я разбирался с cURL, но
"Прямые норы роет
Упрямый глупый крот,
Нормальные герои
Всегда идут в обход...
"
=) короче говоря, хочувсезнатьскорейскорей =).
И еще, чуть не забыл :

<?php
$fp
=fsockopen($host,80,$errno,$errstr,30);
?> 
что задает последний аргумент?

   
 
 автор: Poison   (27.07.2007 в 18:32)   письмо автору
 
   для: amigo62   (27.07.2007 в 18:24)
 

=) короче говоря, хочувсезнатьскорейскорей =).

И я;)

что задает последний аргумент?

Timeout fsockopen();

   
 
 автор: cheops   (28.07.2007 в 12:42)   письмо автору
 
   для: amigo62   (27.07.2007 в 18:24)
 

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

   
 
 автор: testdriver   (27.07.2007 в 21:00)   письмо автору
 
   для: deman-b   (25.07.2007 в 20:52)
 

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

   
 
 автор: Trianon   (27.07.2007 в 21:17)   письмо автору
 
   для: testdriver   (27.07.2007 в 21:00)
 

Это не лимит форума....
Это nginx кусается.

   
 
 автор: amigo62   (27.07.2007 в 21:39)   письмо автору
 
   для: Trianon   (27.07.2007 в 21:17)
 

testdriver, выложите фрагментами! Сгодится любая инфа:)

   
 
 автор: testdriver   (28.07.2007 в 01:30)   письмо автору
 
   для: deman-b   (25.07.2007 в 20:52)
 


<?php
/*======================================================================*\
|| #################################################################### ||
|| # PHP Class передачи POST запросов
|| # 
|| # 
|| # ---------------------------------------------------------------- # ||
|| # Avtor: First.                                                      ||
|| # ---------------------- Контактная информация ------------------- # ||
|| # E-mail: primary_send@mail.ru |                                   # ||
|| # ICQ: 473-133-888                                                 # ||
|| #################################################################### ||
\*======================================================================*/

# пример использования класса
# $http = new httprequest;                                              // создаем класс
# $http->url = "http://www.mysite.ru/";                                 // url
# $http->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"; // user agent
# $http->cookies["SESSION"] = "abJXIJkDBfy5";                           // coockie
# $http->cookies["ID"] = "255";                                         // coockie
# $http->vars["login"] = "";                                            // переменная Login
# $http->vars["pass"] = "";                                             // переменная pass
# //$http->proxy_host = "201.38.194.38";                                // устанавливаем IP Proxy если нужно
# //$http->proxy_port = "6588";                                         // устанавливаем Port Proxy если нужно
# $http->server_connect();                                              // соединяемся с сервером
# $http->send_POST();                                                   // передаем данные (POST)
# $page = $http->answer;                                                // помещаем ответ сервера в переменную
# $http->server_connect_close();                                        // закрываем соединение

class httprequest
{
    var 
$url "";                  // url адрес
    
var $agent "";                // агент
    
var $referer "";              // реферрер
    
var $cookies = array();         // куки
    
var $connection "Keep-Alive"// тип соеднинения
    
var $lang "ru";               // язык
    
var $vars = array();            // переменные
    
var $error;                     // сообщение об ошибке
    
var $socket;                    // сокет
    
var $host "";                 // хост
    
var $port 80;                 // порт
    
var $answer;                    // ответ сервера
    
var $length 2500;             // длина читаемых данных (можно менять)
    
var $proxy_host "";           // прокси хост
    
var $proxy_port "";           // прокси порт
    
    
function server_connect()
    {
        
$url parse_url($this->url);
        
$this->host $url['host'];
        
$this->socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
        if (!empty(
$this->proxy_host) || !empty($this->proxy_port))
        {
            
$host $this->proxy_host;
            
$port $this->proxy_port;
        }
        else
        {
            
$host $this->host;
            
$port $this->port;        
        }
        
$result socket_connect($this->socketgethostbyname($host), $port);
        if (
$result || $result === false
        {
            
$this->error "socket_connect() Произошла ошибка.\nПричина: ($result) " socket_strerror(socket_last_error($this->socket));
            
socket_close($this->socket); //закрываем соединение
        
}            
    }
    
    function 
server_connect_close()
    {
        
socket_close($this->socket); //закрываем соединение    
    
}
    function 
create_packet()
    {
        
$postdata $this->get_vars(); //получаем переменные
        
$cookie $this->get_coockie(); // получаем строку cookie
        //формируем пакет
        
$headers "POST ".$this->url." HTTP/1.0\r\n"
        
$headers .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-icq, application/x-shockwave-flash, */*\r\n";
        
$headers .= "Referer: ".$this->referer."\r\n";
        
$headers .= "Accept-Language: ".$this->lang."\r\n";
        
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
        
$headers .= "Proxy-Connection: ".$this->connection."\r\n";        
        
$headers .= "User-Agent: ".$this->agent."\r\n";
        
$headers .= "Host: ".$this->host."\r\n";
        
$headers .= "Content-Length: ".strlen($postdata)."\r\n";
        
$headers .= "Pragma: no-cache\r\n";
        
$headers .= "Cookie: ".$cookie."\r\n\r\n";
        
$headers .= $postdata;
        return 
$headers;
    }

    function 
send_POST()
    {
        
$headers $this->create_packet(); //формируем пакет
        
$result socket_write($this->socket,$headers,strlen($headers)); //передаем данные на сервер
        
if($result || $result === false
        {
            
$this->error "socket_connect() Произошла ошибка.\nПричина: ($result) " socket_strerror(socket_last_error($this->socket));
        }
        
$this->answer socket_read($this->socket,$this->length); //читаем ответ сервера (25000)
    
}
    
    function 
get_vars()
    {
        if (
count($this->vars) > 0)
        {
            
$postdata "";
            foreach (
$this->vars as $key => $val)
        {
             
$postdata .= urlencode($key)."=".urlencode($val)."&";
            }
            return 
$postdata;
        }                
    }
    
    function 
get_coockie()
    {
        if (
count($this->cookies) > 0)
        {
            
$cookie_string '';
            foreach (
$this->cookies as $key => $val)
            {
             
$cookie_string .= $key."=".urlencode($val)."; ";
            }
            return 
$cookie_string;
        }
        return 
false;
    }    
}
?>

Вот из своего проекта выдрал куски и сделал небольшой класс передачи POST запросов, посмотри может пригодиться.

   
 
 автор: amigo62   (28.07.2007 в 17:06)   письмо автору
 
   для: testdriver   (28.07.2007 в 01:30)
 

Спасибо, обязательно сохраню, но.. на будущее, т.к. в ООП я пока чайнег :-(

   
 
 автор: testdriver   (28.07.2007 в 17:25)   письмо автору
 
   для: amigo62   (28.07.2007 в 17:06)
 

На самом деле все очень просто :)
Сохраняеш этот класс в файл например с именем classhttp.php
а затем подключаеш его в свой скрипт примено вот так:

<?php
include("classhttp.php");// подключаем класс
$http = new httprequest// создаем класс
$http->url "http://www.mysite.ru/login.php"// url
$http->agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"// user agent
$http->cookies["SESSION"] = "abJXIJkDBfy5"// coockie
$http->cookies["ID"] = "255";  // coockie
$http->vars["login"] = "Test";  // переменная Login
$http->vars["pass"] = "12345"// переменная pass
//$http->proxy_host = "201.38.194.38"; // IP Proxy если нужно
//$http->proxy_port = "6588"; // Port Proxy если нужно
$http->server_connect();  // соединяемся с сервером
$http->send_POST();  // передаем данные (POST)
$page $http->answer;  // ответ сервера
$http->server_connect_close(); // закрываем соединение
?>

И собственно все :) Хотя если не чувствуете в себе достаточной уверенности лучше пока и правда к ООП не переходить, нападает лень и самому уже не захочется не чего писать и не в чем разбираться :) А это плохо ...

   
 
 автор: Unkind   (28.07.2007 в 17:29)   письмо автору
 
   для: testdriver   (28.07.2007 в 17:25)
 

Для этого как раз CURL надо применять, а не подобные классы.

   
 
 автор: amigo62   (28.07.2007 в 18:10)   письмо автору
 
   для: Unkind   (28.07.2007 в 17:29)
 

testdriver, вроде все понятно- в смысле как юзать. А как устроено- разберусь обязательно, но позже, когда то же придется учится на ооп писать;)
Unkind, если не трудно, можно ссылки на темы по cURL? Читал справочник, но понял не все и не везде...
И- вопрос остался открытым- как формируются заголовки отправки файла и обращения через прокси?

   
 
 автор: Unkind   (28.07.2007 в 20:09)   письмо автору
 
   для: amigo62   (28.07.2007 в 18:10)
 

Unkind, если не трудно, можно ссылки на темы по cURL? Читал справочник, но понял не все и не везде...
Темы не знаю. Для меня понятнее первоисточник.

как формируются заголовки отправки файла
http://phpclub.ru/detail/article/http_request

обращения через прокси
Вместо /path/ пишется http://host.com/path/; через заголовок Host передается host запрашиваемого ресурса через прокси. Остальное все точно так же.

   
 
 автор: amigo62   (29.07.2007 в 06:11)   письмо автору
 
   для: Unkind   (28.07.2007 в 20:09)
 

тоесть "Host: 201.38.194.8 \r\n
POST http://requested_url/path/ HTTP/1.1 \r\n" верно?

   
 
 автор: Trianon   (29.07.2007 в 12:28)   письмо автору
 
   для: amigo62   (29.07.2007 в 06:11)
 

если адрес прокси myproxy.com, его порт $myproxy_port, а адрес целевого сайта mysite.com, то обращение надо строить по схеме:
$h = fsockopen("myproxy.com", $myproxy_port, ..)
$URI = "http://mysite.com/path/file.php"
$req = "POST $URI HTTP/1.0
Host: mysite.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 35

var1=encodeddata1&var2=encodeddata2
";

   
 
 автор: amigo62   (30.07.2007 в 09:35)   письмо автору
 
   для: Trianon   (29.07.2007 в 12:28)
 

А дальше что? Куда ресурс $h девается? Куда вставить $proxy_login и $proxy_password?
P.S. прочитал статью по ссылке, но чем больше читаю, тем больше вопросов:) сделать бы отдельный форум- "Протоколы"

   
 
 автор: amigo62   (30.07.2007 в 09:49)   письмо автору
 
   для: Trianon   (29.07.2007 в 12:28)
 

Сори, с $h понятно все :)

   
Rambler's Top100
вверх

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