информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Большое спасибо. Тема закрыта 21.09.07 15:52  Число просмотров: 1474
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
<programming>
Не могу получить данные через POST 20.09.07 08:25   [ZloyShaman, dl]
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Делаю следующую вещь. Программа под Windows на C++ устанавливает соединение с сервером, обращается к URL передавая ему данные через заголовок:

…
wsprintf(szURL, "http://www.indigo.ringingcedarsofrussia.org/veche/login.php");
wsprintf(szHeader, "l:%s\np:%s", szLogin, szPassw);
…
hURL = InternetOpenUrl(hInternetSession, lpcszURL, lpcszHeader, lstrlen(lpcszHeader), 0, 0);
…

---

Данные в заголовке успешно доходят до сервера. Там я их обрабатываю PHP-скриптом (параметры присутствуют в массиве, возвращаемом функцией GetAllHeaders):

$headers = GetAllHeaders();
echo “$headers['l']<br>$headers['p']”;

---

Но вот через переменную $_POST к этим данным я обратиться не могу. В чём причина?
во-первых, InternetOpenUrl работает через GET 20.09.07 13:33  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Для POST нужно использовать InternetConnect, HttpOpenRequest, HttpSendRequest.

Во-вторых, даже если бы тут работал POST, то с чего вдруг переменным из заголовка на стороне сервера попадать в $_POST, куда должны складываться переменные, извлеченные из тела запроса.
Насколько мне известно, данные, передаваемые методом POST... 21.09.07 04:49  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 21.09.07 04:53  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Насколько мне известно, данные, передаваемые методом POST для сервера «пустой звук» (он их никак не интерпретирует – так говорит Д. Котеров «Самоучитель PHP» стр.35), поэтому PHP, получив заголовок, должен его разобрать и сформировать переменную $_POST. Чтобы это сделать, интерпретатор читает длину заголовка из переменной “Content-Length”.

Переписал код с Вашими рекомендациями:
	DWORD dwBytesRead;
	char sz[255];

	HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
	HINTERNET hConnect = InternetConnect(hInternet, "www.indigo.ringingcedarsofrussia.org",
			INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
	HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche//login.php", NULL, NULL,
			0, INTERNET_FLAG_KEEP_CONNECTION, 1);
	BOOL bSend = HttpSendRequest(hRequest, "l:VedaCoder@mail.ru\np:123456",-1, NULL,0);
	InternetReadFile(hRequest, sz, 255, &dwBytesRead);

---

Вот, что получает сервер (читаю headers функцией InternetReadFile):
[Cache-Control] => no-cache
[Connection] => Keep-Alive
[Content-Length] => 0
[Host] => www.indigo.ringingcedarsofrussia.org
[l] => VedaCoder@mail.ru
[p] => 123456
[User-Agent] => Test

---

Наверное, проблема в том, что Content-Length = 0. Где у меня опять прокол?
заголовки не относятся к телу запроса 21.09.07 05:03  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Заголовки, разделенные переводом строки, сами по себе, запрос сам по себе. Идет он сразу после заголовков, отделенным еще одним переводом строки. В Content-Length лежит длина запроса (и его надо формировать самостоятельно). Отдельные параметры запроса разделяются не переводом строки, а &, каждый параметр - как имя=значение.
т.е. передавать надо что-то типа
"Content-Length=30\n\nl=VedaCoder@mail.ru&p=123456"
Нелатиницу при этом лучше превращать в вид %XX.
В MSDN сказано, что HttpSendRequest вторым параметром... 21.09.07 05:42  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 21.09.07 06:30  Количество правок: 3
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
В MSDN сказано, что HttpSendRequest вторым параметром принимает header, а третьим его размер. Если этот размер выставить в -1, то он будет рассчитан автоматически.

Когда я добавляют строку “Content-Length” в начало своего заголовка (“Content-Length:29\n\nl:VedaCoder@mail.ru&p:123456”) функция HttpSendRequest виснет (выхода из неё в отладчике я так и не дождался).

Пардон, в HttpSendRequest я не туда свои данные передал. Их нужно в 4 и 5 параметр. Но это не помогло. Content-Length теперь не нулевая, но в _POST данных по прежнему нету:

BOOL bSend = HttpSendRequest(hRequest, NULL, 0, "l=VedaCoder@mail.ru&p=123456",29);

ЗЫ. Спасибо за быстрый ответ.
реально, конечно, нужно не 29, а sizeof(строки) 21.09.07 13:33  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Для контроля на стороне сервера стоит распечатать, что ему при этом приходит на stdin.
Ну и полезно указать среди заголовков Content-type: application/x-www-form-urlencoded
dl, спасибо. Проблема была в том, что не указывал... 21.09.07 13:46  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
dl, спасибо. Проблема была в том, что не указывал "Content-Type:application/x-www-form-urlencoded". Вот рабочий код:

DWORD dwBytesRead;
char sz[255];

HINTERNET hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hInternet, "indigo.ringingcedarsofrussia.org",
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1u);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "veche/login.php", HTTP_VERSION, "localhost", 
0, INTERNET_FLAG_KEEP_CONNECTION, 1);
BOOL bSend = HttpSendRequest(hRequest, "Content-Type:application/x-www-form-urlencoded", -1, "l=VedaCoder@mail.ru&p=123456",28);

InternetReadFile(hRequest, sz, 255, &dwBytesRead);

---

Может быть есть ещё какие-нибудь параметры в заголовке, которые также желательно указать, чтобы не возникало проблем?
этих достаточно 21.09.07 13:52  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
Размер и тип передаваемых данных, остальное опционально - referer, user-agent, authorization, куки и т.п.

Разве что в зависимости от хостинга может потребоваться указание заголовка Host, чтобы взаимодействовать с одним из виртуальных серверов, лежащих на одном IP (хотя есть шанс ,что WinINet и его может формировать самостоятельно).
Большое спасибо. Тема закрыта 21.09.07 15:52  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[moved from networking]
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach