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

Форум PHP

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

 

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

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

тема: Авторизация с помошью сокетов
 
 автор: Max78   (18.04.2010 в 16:28)   письмо автору
 
 

здравствуйте у меня не получается авторизация с помошью сокетов. Вот код



$hostname = "win.mail.ru"; 
  $path = "/cgi-bin/auth"; 
  $line = ""; 
  // Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  $fp = fsockopen($hostname, 80, $errno, $errstr, 30); 
  // Проверяем успешность установки соединения 
  if (!$fp) echo "$errstr ($errno)<br />\n"; 
  else 
  { 
    // Данные HTTP-запроса  
   // $data ="Login=login&Password=parol&Domain=mail.ru\r\n\r\n"; 
       $data ="Login=login&Password=parol&Domain=mail.ru\r\n\r\n"; 
    // Заголовок HTTP-запроса     
    $headers = "POST $path HTTP/1.1\r\n"; 
    $headers .= "Host: $hostname\r\n"; 
    $headers .= "Connection: close\r\n"; 
    $headers .= "User-Agent: Opera/9.20 (Windows NT 6.0; U; en)\r\n"; 
     // $headers .= "Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,* /*;q=0.5\r\n"; 
     // $headers .= "Accept-Language: en-us,en;q=0.5\r\n"; 
     // $headers .= "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"; 
     // $headers .= "Referer: $hostname\r\n"; 
    $headers .= "Content-type: application/x-www-form-urlencoded\r\n"; 
    $headers .= "Content-Length: ".strlen($data)."\r\n\r\n"; 
    // Отправляем HTTP-запрос серверу 
    fwrite($fp, $headers.$data); 
    // Получаем ответ 
    while (!feof($fp)) 
    { 
      $line .= fgets($fp, 1024); 
    } 
    fclose($fp); 
  } 
  
echo "<pre>"; print_r($line); echo "</pre>";



Он мне выдаёт следующий ответ



HTTP/1.1 302 OK
Server: nginx/0.7.62
Date: Sun, 18 Apr 2010 12:37:38 GMT
Content-Type: text/html
Connection: close
Location: http://win.mail.ru/cgi-bin/login?fail=1
Set-Cookie: mrcu=5D954BCAFD127C48120D0100007F; expires=Wed, 15 Apr 2020 12:37:38 GMT; path=/; domain=.mail.ru
Cache-Control: no-cache,no-store,must-revalidate
Pragma: no-cache
Expires: Sat, 18 Apr 2009 12:37:38 GMT
Last-Modified: Sun, 18 Apr 2010 16:37:38 GMT
Content-Length: 52
X-Host: f222.mail.ru

  Ответить  
 
 автор: cheops   (18.04.2010 в 17:52)   письмо автору
 
   для: Max78   (18.04.2010 в 16:28)
 

Первое что нужно, это проверить не требуется ли установить Cookie... Скорее всего на этом вас и ловит сервер, что вы при каждом обращении новую сессию начинаете.

  Ответить  
 
 автор: Max78   (18.04.2010 в 18:33)   письмо автору
 
   для: cheops   (18.04.2010 в 17:52)
 


Location: http://win.mail.ru/cgi-bin/login?fail=1
Set-Cookie: mrcu=5D954BCAFD127C48120D0100007F; expires=Wed, 15 Apr 2020 12:37:38 GMT; path=/; domain=.mail.ru


из полученного ответа я должен указать новый путь
и передать кукисы . я прав?


 $hostname = "win.mail.ru"; 

      $path = "/cgi-bin/login?fail=1";  

  $line = ""; 

  // Передаём методом POST 
  // Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  $fp = fsockopen($hostname, 80, $errno, $errstr, 30); 
  // Проверяем успешность установки соединения 
  if (!$fp) echo "$errstr ($errno)<br />\n"; 
  else 
  { 
    $headers = "GET $path HTTP/1.1\r\n"; 
    $headers .= "Host: $hostname\r\n"; 
    $headers .= "Cookie: mrcu=5D954BCAFD127C48120D0100007F; path=/; domain=.mail.ru\r\n"; // constant
    $headers .= "Connection: Close\r\n\r\n"; 
    // Отправляем HTTP-запрос серверу 
     fwrite($fp, $headers); 
    // fwrite($fp, $headers.$data); 
    // Получаем ответ 
    while (!feof($fp)) 
    { 
      $line .= fgets($fp, 1024); 
    } 
     

    fclose($fp); 
  } 

  Ответить  
 
 автор: cheops   (19.04.2010 в 13:21)   письмо автору
 
   для: Max78   (18.04.2010 в 18:33)
 

Боюсь, значение mrcu будет каждый раз разным, вероятно сначала нужно дернуть страницу авторизации, получить значение HTTP-заголовка Set-Cookie, и потом устанавливать его в следующем запросе.

  Ответить  
 
 автор: Max78   (20.04.2010 в 09:05)   письмо автору
 
   для: cheops   (19.04.2010 в 13:21)
 

Здравствуйте а как с помошью регулярных выражений вырезать значение куки mrcu
Set-Cookie: mrcu=DD304BCD309B0B4897428CD07355; expires=Fri, 17 Apr 2020 04:42:03 GMT; path=/; domain=.mail.ru

и правильно ли я . Потом подделываю куки

$headers .= "Set-Cookie: mrcu=DD304BCD309B0B4897428CD07355; expires=Fri, 17 Apr 2020 04:42:03 GMT; path=/; domain=.mail.ru\r\n"; 


уже 3 день подряд сижу ничего не получается.
Свои скрипты на локалхосте получается за 1 минуту, а этот майл ру ну ни как не получается.
Сперва как вы и советовали начал всё с начала
www.mail.ru потом исходя из полученного ответа
$hostname = "win.mail.ru"; 
  $path = "/cgi-bin/auth";  
затем

$hostname = "win.mail.ru"; 
  $path = "/cgi-bin/start";  
затем


 $hostname = "win.mail.ru"; 
  $path = "/cgi-bin/login";  

  Ответить  
 
 автор: cheops   (20.04.2010 в 12:31)   письмо автору
 
   для: Max78   (20.04.2010 в 09:05)
 

Нет, вы должны отправить следующий заголовок (Set-Cookie - это только для клиента)
$headers .= "Cookie: mrcu=DD304BCD309B0B4897428CD07355;\r\n"

Для извлечения значения можно использовать регулярное выражение вида
|mrcu=([^;]+);|is

  Ответить  
 
 автор: Max78   (20.04.2010 в 15:07)   письмо автору
 
   для: cheops   (20.04.2010 в 12:31)
 

Правильно ли я сделал. Сперва открыл главную страницу майл.ру. Затем считал куки и отправил их . затем он дважды менял локейшн. Я их указывал в пути. Но ничего не получилось. где у меня ошибки в коде. (поподробнее) Попробуйте сами б у вас должно за 5 минут получиться. я уже 5 день не могу сделать.

<?php 
  $hostname 
"www.mail.ru"
  
$path "/";  

  
$line ""
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
$headers "GET $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
     
fwrite($fp$headers); 
    
// fwrite($fp, $headers.$data); 
    // Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
     

    
fclose($fp); 
  } 
     echo 
"<pre>"print_r($line); echo "</pre>";


    
    
    
//  step 2 

    
if( preg_match_all('#^Set-Cookie:\\s*([^=]+)=([^;\\s]+)#m'$line$matches) ) 

    
$cookie_header 'Cookie: '

    for(
$i 0$i count($matches[0]); $i++) 
        
$cookie_header .= ($i '; ' '') . $matches[1][$i] . '=' $matches[2][$i]; 

    
$out .= $cookie_header "\r\n"
}
  echo 
$out;



   
$hostname "win.mail.ru"
  
$path "/cgi-bin/auth"
  
$login="login"$pass="pass"$domain="mail.ru";

  
$line ""
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
// Данные POST-запроса 
    
$data "login=" urlencode($login) . "&password=" urlencode($$pass) . "&domain=" urlencode($domain) . "&\r\n\r\n"
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= $out."\r\n"// constant
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
     //fwrite($fp, $headers); 
     
fwrite($fp$headers.$data); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
     

    
fclose($fp); 
  } 
  echo 
"<pre>"print_r($line); echo "</pre>";


// step 3


  
$path "/cgi-bin/start";

  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
// Данные POST-запроса 
    
$data "login=" urlencode($login) . "&password=" urlencode($$pass) . "&domain=" urlencode($domain) . "&\r\n\r\n"
    
// Формируем HTTP-заголовки для передачи 
    // его серверу 
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= $out."\r\n"// constant
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
     //fwrite($fp, $headers); 
     
fwrite($fp$headers.$data); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
     

    
fclose($fp); 
  } 
  echo 
"<pre>"print_r($line); echo "</pre>";




/// step 4


$path "/cgi-bin/login";

  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
// Данные POST-запроса 
    
$data "login=" urlencode($login) . "&password=" urlencode($$pass) . "&domain=" urlencode($domain) . "&\r\n\r\n"
    
// Формируем HTTP-заголовки для передачи 
    // его серверу 
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= $out."\r\n"// constant
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
     //fwrite($fp, $headers); 
     
fwrite($fp$headers.$data); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
  } 
    echo 
"<pre>"print_r($line); echo "</pre>";

?>


  Ответить  
 
 автор: cheops   (20.04.2010 в 16:27)   письмо автору
 
   для: Max78   (20.04.2010 в 15:07)
 

Ловушек там может быть множество - вы, например, не отправляете USER-AGENT - скорее всего mail.ru видит, что к нему обращается какой-то скрипт PHP-5.2 и естественная реакция - отказать в доступе. Помимо USER-AGENT скрипт может ожидать реферер (это, конечно, вряд ли - слишком ненадежно и могут быть отказы у пользователей фаерволов, но всякое может быть).
То что я быстрее разберусь в ситуации - совершенно не факт. Собственную авторизацию я бы прошел очень быстро - авторизацию mail.ru, которая вероятно при малейшем подозрении ещё и графический код выставит - далеко не факт.

  Ответить  
 
 автор: neadekvat   (20.04.2010 в 18:11)   письмо автору
 
   для: cheops   (20.04.2010 в 16:27)
 

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

  Ответить  
 
 автор: cheops   (20.04.2010 в 19:31)   письмо автору
 
   для: neadekvat   (20.04.2010 в 18:11)
 

Лишним не будет, возможно на странице авторизации не одна cookie устанавливается - возможно сервер ждет вторую cookie.

  Ответить  
 
 автор: Max78   (21.04.2010 в 12:42)   письмо автору
 
   для: neadekvat   (20.04.2010 в 18:11)
 

а как узнать досконально все отправляемые и принимаемые браузером заголовки? это куда надо смотреть?

  Ответить  
 
 автор: Valick   (21.04.2010 в 12:45)   письмо автору
 
   для: Max78   (21.04.2010 в 12:42)
 

если не ошибаюсь, то была специальная прога заточенная именно под это
(года два назад читал про это)

  Ответить  
 
 автор: cheops   (21.04.2010 в 12:46)   письмо автору
 
   для: Max78   (21.04.2010 в 12:42)
 

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

  Ответить  
 
 автор: Max78   (21.04.2010 в 12:47)   письмо автору
 
   для: cheops   (20.04.2010 в 16:27)
 


<?php 
$login
="логин";
$domain="mail.ru";
$pass "пароль";
$hostname "win.mail.ru"
$path "/cgi-bin/auth"
$fp fsockopen($hostname,80); 
if(!
$fp){
echo
"no!";
}
else{ 
$data "Login=$login&Domain=$domain&Password=$pass&page=1&post=1&login_from=1\r\n\r\n"// отправляемые даные!
$headers "POST $path HTTP/1.1\r\n"
$headers .= "Host: $hostname\r\n"
$headers .= "Connection: close\r\n"
$headers .= "User-Agent: Opera/9.20 (Windows NT 6.0; U; en)\r\n"
$headers .= "Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,* /*;q=0.5\r\n"
$headers .= "Accept-Language: en-us,en;q=0.5\r\n"
$headers .= "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"
$headers .= "Referer: $hostname\r\n"
$headers .= "Content-Type: application/x-www-form-urlencoded\r\n"
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n"

fputs($fp,$headers.$data); 

while(!
feof($fp))
 {
 
$line=fread($fp,1000);
    
     echo 
"<pre>"print_r($line); echo "</pre>";
  
 }
}
 
fclose($fp); 

?>

ответ
HTTP/1.1 302 OK
Server: nginx/0.7.62
Date: Wed, 21 Apr 2010 08:27:00 GMT
Content-Type: text/html
Connection: close
Set-Cookie: t=obLD1AAAAAAIAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAMBAA AAAAAAAAAZAAoHugcA; expires=Mon, 18 Oct 2010 08:27:00 GMT; path=/; domain=.mail.ru
Set-Cookie: Mpop=1271838420:7960545a7b554c46190502190c1d00051c0 c074f6a5d5e465e07010000061e0a73751e 4d58595d5148000d1658505d5b174345:taalay78@mail.ru:; expires=Tue, 20 Jul 2010 08:27:00 GMT; path=/; domain=.mail.ru
Location: http://win.mail.ru/cgi-bin/checkcookie?id=7960545a7b554c46190502190c1d00051c0 c074f6a5d5e465e07010000061e0a73751e 4d58595d5148000d1658505d5b174345
Set-Cookie: mrcu=58B44BCEB6D44F4BFB600100007F; expires=Sat, 18 Apr 2020 08:27:00 GMT; path=/; domain=.mail.ru
Cache-Control: no-cache,no-store,must-revalidate
Pragma: no-cache
Expires: Tue, 21 Apr 2009 08:27:00 GMT
Last-Modified: Wed, 21 Apr 2010 12:27:00 GMT
Content-Length: 157
X-Host: f202.mail.ru

http://win.mail.ru/cgi-bin

кажется я где то рядом хожу, но ни как не могу. Помогите пожалуйста.

  Ответить  
 
 автор: Trianon   (21.04.2010 в 13:00)   письмо автору
 
   для: Max78   (21.04.2010 в 12:47)
 

Это не окончательный ответ.
Это такой же 302 / Location:

.сервер .ваш скрипт по этому пути может гонять 5 раз, а может (условно говоря) и 50 раз.
Если Вы пытаетесь эту цепь определить как статическую, то зря.

  Ответить  
 
 автор: Max78   (21.04.2010 в 13:17)   письмо автору
 
   для: Trianon   (21.04.2010 в 13:00)
 

я в документах куки просмотрел C/document and settings/admin/cookie , там такие же значения прописаны . Хотя уже голова закружилась. уже 8 день с утра до вечера сижу. Весь гугл измотал. Есть авторизация на майл ру . Только она написана на перле. Кстати вам (сайту) пора книгу издать на счёт сокетов. Более подробно как для начинаюших так и для профессионалов. Кстати не могли бы вы подсказать хорошие российские или зарубежные форумы по пхп. уже проверенные чтоб время не терять, а то гугл слишком много выдаёт.

  Ответить  
 
 автор: Рома   (20.04.2010 в 18:09)   письмо автору
 
   для: Max78   (20.04.2010 в 15:07)
 

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

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

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