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

Форум PHP

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

 

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

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

тема: Отправка сообщения через сокеты.
 
 автор: drago   (21.12.2005 в 08:28)   письмо автору
 
 

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

В теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1879 нашел пример, и чуть изменил.


<?php
$hostname 
"www.site.net"
  
$path "/folder/?messages&add";
  
$line ""
   
$fp fsockopen($hostname80$errno$errstr30); 
    if (!
$fp
    echo 
"$errstr ($errno)<br />\n"
  else 
  { 
       
$data "touser=" urlencode("name") . "&title=" urlencode("title") . "&text=" urlencode("text") . "&sendbutton=" urlencode ("1") . "\r\n\r\n"
    
$headers "POST $path http/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
    
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n"
    
fwrite($fp$headers.$data); 
    while (!
feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
  } 
  echo 
$line;
?>

Но при отправке, открывается страница с формой, а передача данных не происходит.
Что я упустил?

   
 
 автор: cheops   (21.12.2005 в 14:05)   письмо автору
 
   для: drago   (21.12.2005 в 08:28)
 

Данные скорее всего передаются, но обработчик требует либо реферер, либо сессию, посмотрите темы по ссылкам:
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8931
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9050

   
 
 автор: Drago   (21.12.2005 в 16:03)   письмо автору
 
   для: cheops   (21.12.2005 в 14:05)
 

Попробовал отправить сессию, как вы показывали, но все-равно не получается.

<?php 
  $hostname 
"www.site.net"
  
$path "/folder/?messages&add"

  
// Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
// Формируем HTTP-заголовки для передачи 
    // его серверу 
    
$headers "GET $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
    
fwrite($fp$headers); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line fgets($fp1024); 
      
// Ищем строку вида 
      // Set-Cookie: PHPSESSID=6197e647566bdaa24da3ab42ae7604b2; 
      // Именно она устанавливает cookie 
      
preg_match("|Set-Cookie: PHPSESSID=([\d\w]+);|i",$line,$out); 
      if(!empty(
$out[1])) 
      { 
        
$SID $out[1]; 
        break; 
      } 
    } 
    
fclose($fp); 
  } 

  
$hostname "www.site.net"
  
$path "/folder/?messages&add"
  
$line ""

  
// Передаём методом POST имя пользователя (admin), 
  // его пароль (admin), скрытое поле session_id ($SID) 
  // В заголовках, передаём cookie PHPSESSID 
  // Устанавливаем соединение, имя которого 
  // передано в параметре $hostname 
  
$fp fsockopen($hostname80$errno$errstr30); 
  
// Проверяем успешность установки соединения 
  
if (!$fp) echo "$errstr ($errno)<br />\n"
  else 
  { 
    
// Данные POST-запроса 
    
$data "touser=name&title=title&text=text&sendbutton=1&session_id=$SID&\r\n\r\n"
    
// Формируем HTTP-заголовки для передачи 
    // его серверу 
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
    
$headers .= "Content-Length: ".strlen($data)."\r\n"
    
// Подделываем cookie 
    
$headers .= "Cookie: PHPSESSID=$SID;\r\n"
    
$headers .= "Connection: Close\r\n\r\n"
    
// Отправляем HTTP-запрос серверу 
    
fwrite($fp$headers.$data); 
    
// Получаем ответ 
    
while (!feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
  } 
  echo 
$line
?>

Сверху над формой, пишется

HTTP/1.1 302 Found Date: Wed, 21 Dec 2005 12:53:42 GMT Server: Apache/1.3.29 (Unix) PHP/5.0.4 mod_deflate/1.0.19 rus/PL30.19 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=0add3906dd00fb33260ab3d7438d6e10; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: userid=deleted; expires=Tue, 21 Dec 2004 12:53:41 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Tue, 21 Dec 2004 12:53:41 GMT; path=/ Set-Cookie: userid=deleted; expires=Tue, 21 Dec 2004 12:53:41 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Tue, 21 Dec 2004 12:53:41 GMT; path=/ Location: /folder/login.php Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=windows-1251 Vary: accept-charset, user-agent 1bdc

Я так понимаю, что нужно отправлять еще и куку userid. Но как ее узнать, если она не всегда одинакова?

   
 
 автор: cheops   (22.12.2005 в 03:04)   письмо автору
 
   для: Drago   (21.12.2005 в 16:03)
 

А какое время было в момент отправки запроса - тут куча временных меток...

   
 
 автор: Drago   (22.12.2005 в 03:32)   письмо автору
 
   для: cheops   (22.12.2005 в 03:04)
 

Не помню, какое было тогда.
Но отправил только что, выдало вот это.

HTTP/1.1 302 Found Date: Thu, 22 Dec 2005 00:29:51 GMT Server: Apache/1.3.29 (Unix) PHP/5.0.4 mod_deflate/1.0.19 rus/PL30.19 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=5a774e86e4ee6cabe1560ad0526d1f04; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: userid=deleted; expires=Wed, 22 Dec 2004 00:29:50 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Wed, 22 Dec 2004 00:29:50 GMT; path=/ Set-Cookie: userid=deleted; expires=Wed, 22 Dec 2004 00:29:50 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Wed, 22 Dec 2004 00:29:50 GMT; path=/ Location: /folder/login.php Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=windows-1251 Vary: accept-charset, user-agent 1bdc

   
 
 автор: Drago   (23.12.2005 в 01:21)   письмо автору
 
   для: cheops   (22.12.2005 в 03:04)
 

А эти метку, могут сильно помешать?

   
 
 автор: cheops   (23.12.2005 в 14:26)   письмо автору
 
   для: Drago   (23.12.2005 в 01:21)
 

В принципе сказать наверняка нельзя... вообще они похоже на команды по уничтожению cookie...

   
 
 автор: Drago   (23.12.2005 в 15:54)   письмо автору
 
   для: cheops   (23.12.2005 в 14:26)
 

Отправил скрипту куки, что была установлена у меня. Получил вот это.

HTTP/1.1 200 OK Date: Fri, 23 Dec 2005 12:48:06 GMT Server: Apache/1.3.29 (Unix) PHP/5.0.4 mod_deflate/1.0.19 rus/PL30.19 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=c81314d43e14b6f2500b9844813107a2; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: userid=login+655c303fb229e27bb6bb38e2c2ac53e0_id_; expires=Sat, 24 Dec 2005 12:48:06 GMT; path=/; domain=.site.net Set-Cookie: userid=login+655c303fb229e27bb6bb38e2c2ac53e0_id_; expires=Sat, 24 Dec 2005 12:48:06 GMT; path=/ Set-Cookie: userid=login+655c303fb229e27bb6bb38e2c2ac53e0_id_; expires=Sat, 24 Dec 2005 12:48:06 GMT; path=/; domain=.site.net Set-Cookie: userid=login+655c303fb229e27bb6bb38e2c2ac53e0_id_; expires=Sat, 24 Dec 2005 12:48:06 GMT; path=/ Transfer-Encoding: chunked Content-Type: text/html; charset=windows-1251 Vary: accept-charset, user-agent 1c0d

Скрипт меня узнал, как будто я нормально зашел, но сообщение, все-равно не отправляет.
Я уже начинаю сомневаться, возможно ли это вообще? Или там сильно хитрая защита?

   
 
 автор: Drago   (25.12.2005 в 00:18)   письмо автору
 
   для: Drago   (23.12.2005 в 15:54)
 

Я ему уже и реферер отправлял, а он все-равно не работает.

<?php
$hostname 
"www.site.net"
$path "/folder/?messages&add"
$line ""
$fp fsockopen($hostname80$errno$errstr30); 
if (!
$fp
   echo 
"$errstr ($errno)<br />\n"
else 

  
$data "touser=name&title=title&text=text&sendbutton=1 \r\n\r\n"
  
$headers "POST $path http/1.1\r\n"
  
$headers .= "Host: $hostname\r\n"
  
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
  
$headers .= "Cookie: userid=login+655c303fb229e27bb6bb38e2c2ac53e0_id_;\r\n"
  
$headers .= "Referer: http://www.site.net/folder/?messages&add\r\n";
  
$headers .= "User-Agent: Opera/8.01 (Windows NT 5.1; U; ru)\r\n";
  
$headers .= "Content-Length: ".strlen($data)."\r\n\r\n"
  
fwrite($fp$headers.$data); 
  while (!
feof($fp)) 
  { 
    
$line .= fgets($fp1024); 
  } 
  
fclose($fp); 

echo 
$line;
?>

   
 
 автор: cheops   (25.12.2005 в 13:42)   письмо автору
 
   для: Drago   (25.12.2005 в 00:18)
 

Вы не отправляете PHPSESSID и используете постоянный SID в userid - 655c303fb229e27bb6bb38e2c2ac53e0. Так не пойдёт, необходимо предварительно выяснять SID, который вам назначает сервер, как это описывается в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9050

   
 
 автор: Drago   (25.12.2005 в 14:00)   письмо автору
 
   для: cheops   (25.12.2005 в 13:42)
 

Пробовал вот так, в результате куки не распазнаются.

<?php 
  $hostname 
"www.site.net"
  
$path "/folder/?messages&add"
  
$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";    
    
fwrite($fp$headers); 
    while (!
feof($fp)) 
    { 
      
$line fgets($fp1024);     
      
preg_match("|Set-Cookie: PHPSESSID=([\d\w]+);|i",$line,$out); 
      if(!empty(
$out[1])) 
      { 
        
$SID $out[1]; 
        
$f fopen ("file""w");
        
fwrite ($f$SID);
        
fclose ($f);
        break; 
      } 
    } 
    
fclose($fp); 
  } 

  
$hostname "www.site.net"
  
$path "/folder/?messages&add"
  
$line ""
  
$fp fsockopen($hostname80$errno$errstr30); 
  if (!
$fp) echo "$errstr ($errno)<br />\n"
  else 
  {     
    
$data "touser=name&title=title&text=text&sendbutton=1&\r\n\r\n";     
    
$headers "POST $path HTTP/1.1\r\n"
    
$headers .= "Host: $hostname\r\n"
    
$headers .= "Content-type: application/x-www-form-urlencoded\r\n"
    
$headers .= "Content-Length: ".strlen($data)."\r\n";     
    
$headers .= "Cookie: PHPSESSID=$SID;\r\n";
    
$headers .= "Cookie: heroesuserid=login+".$SID."_id_;\r\n"
    
$headers .= "Referer: http://www.site.net/folder/?messages&add\r\n";
    
$headers .= "User-Agent: Opera/8.01 (Windows NT 5.1; U; ru)\r\n";
    
$headers .= "Connection: Close\r\n\r\n";     
    
fwrite($fp$headers.$data);     
    while (!
feof($fp)) 
    { 
      
$line .= fgets($fp1024); 
    } 
    
fclose($fp); 
  } 
  echo 
$line
?>

Выдает вот это

HTTP/1.1 302 Found Date: Sun, 25 Dec 2005 10:57:12 GMT Server: Apache/1.3.29 (Unix) PHP/5.0.4 mod_deflate/1.0.19 rus/PL30.19 X-Powered-By: PHP/5.0.4 Set-Cookie: PHPSESSID=60e27394a33da26385f5c7fea39cf4f5; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: userid=deleted; expires=Sat, 25 Dec 2004 10:57:11 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Sat, 25 Dec 2004 10:57:11 GMT; path=/ Set-Cookie: userid=deleted; expires=Sat, 25 Dec 2004 10:57:11 GMT; path=/; domain=.site.net Set-Cookie: userid=deleted; expires=Sat, 25 Dec 2004 10:57:11 GMT; path=/ Location: /folder/login.php Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=windows-1251 Vary: accept-charset, user-agent 1bdc

И помоему, в userid записывается не SID, а хэш пароля. Так как при повторном логине, он не меняется.

   
 
 автор: Drago   (26.12.2005 в 23:01)   письмо автору
 
   для: Drago   (25.12.2005 в 14:00)
 

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

   
 
 автор: cheops   (27.12.2005 в 13:27)   письмо автору
 
   для: Drago   (26.12.2005 в 23:01)
 

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

   
 
 автор: Drago   (27.12.2005 в 19:56)   письмо автору
 
   для: cheops   (27.12.2005 в 13:27)
 

Спасибо. Так бы сразу и сказали. :)
Раз это сделать сложно, то делать это дальше, не вижу смысла, так как "Овчинка, выделки не стоит". :)

   
Rambler's Top100
вверх

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