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

Форум PHP

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

 

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

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

тема: Проблемы с cookie при работе с сокетами
 
 автор: kodges   (24.02.2013 в 09:20)   письмо автору
 
 

Здравствуйте.
В общем делаю небольшой парсер яндекса на сокетах.
Вот функция которую я наваял:

function sok_get_url( $url, $source_ip, $referer = '', $cookies = '' )
{
    $parse_url             = parse_url( $url );
    $hostname             = $parse_url['host'];
    $path                 = $parse_url['path'];
    $query                 = $parse_url['query'];
    $request            = iconv( "windows-1251", "utf-8", $path . '?' . $query );
    $destination_ip         = gethostbyname( $hostname );
    
    $headers .= "GET {$request} HTTP/1.0\r\n";
    $headers .= "Host: {$hostname}\r\n";
    $headers .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n";
    $headers .= "Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n";
    $headers .= "Accept-Encoding: deflate\r\n";
    $headers .= "Accept-Language: ru,en;q=0.9\r\n";
    $headers .= "Referer: {$referer}\r\n";
    $headers .= "User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)\r\n";
    $headers .= "Cookie: {$cookies}\r\n";
    $headers .= "Connection: Close\r\n\r\n";

    if ( !$sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ) ) die( socket_strerror( socket_last_error() ) );
    if ( !socket_bind( $sock, $source_ip ) ) die( socket_strerror( socket_last_error() ) );
    if ( !socket_connect( $sock, $destination_ip, 80 ) ) die( socket_strerror( socket_last_error() ) );
    if ( !socket_write( $sock, $headers ) ) die( socket_strerror( socket_last_error() ) );
    while( $row = socket_read( $sock, 2048 ) )
    {
        $out .= $row;
    }
    socket_close( $sock );

    // Обрабатываем заголовки
    preg_match( "/^(.*)\r\n\r\n/isU", $out, $match );
    $head = explode( "\r\n", $match[1] );
    for($i=0; $i<count($head); $i++)
    {
        // Получаем куки
        if( strtolower( substr( $head[$i], 0, 12 ) ) == 'set-cookie: ' )
            $result['cookies'] .= substr( $head[$i], 12, strpos( $head[$i], ";" )-12 ) . ";";
        // Обрабатываем редирект
        if( strtolower( substr( $head[$i], 0, 10 ) ) == 'location: ' )
            return sok_get_url( substr( $head[$i], 10 ), $source_ip, $url, $result['cookies'] );
    }
    $result['content'] = preg_replace( "/^(.*\r\n\r\n)/isU", "", $out );
    return $result;
}


Фишка в том что на сервере несколько IP, и сокеты позволяют делать запросы с разных IP в то время как cURL и все остальное обращается всегда с одного, главного IP сервера.

Что я делаю, сначала стучусь просто на морду яндекса как обычный юзер в браузере и получаю куки.

$ip = 'IP адрес моего сервера для исходящего запроса';
// стучимся за куками
$get1 = sok_get_url( 'http://yandex.ru/', $ip );


Далее я стучусь уже в поиск яндекса, и сую ему полученные куки с предыдущего запроса, а также реферер

$request = "http://yandex.ru/yandsearch?text={$text}&clid=1917061&lr=0";
$get2 = sok_get_url( $request, $ip, 'http://yandex.ru/', $get1['cookies'] );


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

  Ответить  
 
 автор: kodges   (24.02.2013 в 10:21)   письмо автору
 
   для: kodges   (24.02.2013 в 09:20)
 

Вдогонку...
Сейчас проверил куки в браузере и с удивлением обнаружил что браузер получает и отправляет гораздо больше кукисов чем скрипт. Отсюда вопрос, почему скрипт не получает всех кукисов? Причем пробовал и на cURL, аналогично, cURL сохраняет в файл далеко не все кукисы по сравнению с браузером при точно таком же запросе.

Возможно ли что яндекс часть кукисов ставит каким то другим способом? Яваскриптами например? Хотя с другой стороны каким бы способом их не ставили, все они должны присутствовать в заголовках ответа сервера, разве нет?

Есть у кого мысли по данному вопросу?

  Ответить  
 
 автор: Valick   (24.02.2013 в 10:56)   письмо автору
 
   для: kodges   (24.02.2013 в 10:21)
 

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

  Ответить  
 
 автор: kodges   (24.02.2013 в 11:13)   письмо автору
 
   для: Valick   (24.02.2013 в 10:56)
 

Да вы абсолютно правы!
Провел ряд тестов и убедился что куки установленные яваскриптом не присутствуют в загловках ответа сервера. А также убедился что если взять все нужные куки из браузера и отправить в запросе, то никакой капчи, никаких пролем...
Теперь весь вопрос сводится к одному. Как средствами PHP получить все кукисы, чем бы они не были установлены, яваскриптом перлом и т.д...

  Ответить  
 
 автор: Valick   (24.02.2013 в 12:11)   письмо автору
 
   для: kodges   (24.02.2013 в 11:13)
 

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

  Ответить  
 
 автор: kodges   (24.02.2013 в 12:25)   письмо автору
 
   для: Valick   (24.02.2013 в 12:11)
 

Как раз установить то их не проблема. Я руками взял скопировал куки из браузера, прописал в скрипт и передал, и яндекс даже не пикнул ничего против.
Если вы знаете как получить на php куки отправленные через JS, скажите пожалуйста. Я вот уже пол интернета прогуглил но ничего не нашел. И честно говоря не представляю как это можно сделать.

  Ответить  
 
 автор: Valick   (24.02.2013 в 12:41)   письмо автору
 
   для: kodges   (24.02.2013 в 12:25)
 

Я руками взял скопировал куки из браузера
вот именно вы их типа установили руками
по запросу эмуляция браузера на php гуглили?

  Ответить  
 
 автор: Valick   (24.02.2013 в 12:42)   письмо автору
 
   для: kodges   (24.02.2013 в 12:25)
 

Если вы знаете как получить на php куки отправленные через JS
их надо искать в теле документа а не в заголовках

  Ответить  
 
 автор: kodges   (24.02.2013 в 12:59)   письмо автору
 
   для: Valick   (24.02.2013 в 12:42)
 

Нету их в теле документа. Просто потому что там яваскрипт который подгружает что-то еще с сервера, то в свою очередь подгружает что-то еще и т.д... и где то там глубоко в ж*пе выполняется установка кукисов. Браузер то это дело обрабатывает нормально. Загрузил все, построил дом поставил кукисы... А вот как быть в этом случае с PHP пока не знаю...

На ум приходит только одна мысль, найти какой то консольный линуксовый клиент понимающий JS, и через exec скидывать ему урл страницы и получать в ответ заголовки со всеми куками.
Но exec и ему подобные это лишняя дырка в безопасности сервера (((

  Ответить  
 
 автор: kodges   (24.02.2013 в 15:31)   письмо автору
 
   для: kodges   (24.02.2013 в 09:20)
 

По сути вот решение моего вопроса http://anosov.org.ru/2012/01/htmlunit-for-indexing-javascript/
Вот только приведенный по ссылке пример возвращает голый исходник страницы без заголовков.
Есть тут кто может помочь допилить этот вариант чтобы в ответ возвращались все установленные куки? К сожалению я сам мало что понимаю в программировании на Java и Eclipse о которых пишется в статье.

  Ответить  
Rambler's Top100
вверх

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