PDA

Просмотр полной версии : Release HttpProxyServer


da_ff
16.07.2007, 21:25
Вот собсна решил наваять и выложить на общий суд
-язык с+api
-открывает 31337 порт
-логов не ведет
-весит мало ~10к (так я не понял откуда лишних 5к взялись а они лишние, точно)
-исходники прилагаются

HttpProxyServer (http://ifolder.ru/2687894)

da_ff
18.07.2007, 11:49
несколько человек добавили в репу с примерно следующим коментариемна*** релизить ***ню всякую? давай ещё блокнот напишем?
причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.

KEZ
19.07.2007, 21:21
> причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.

НИКАК не лучше и НИКАК не хуже потому что это просто ПРОКСИ, сорцов которого полно в инете на каждом сайте.

> -язык с+api
поведуй, что это а язык такой c+api?

хотя знаешь, тупости я в сорцах немного нашел. видимо это свойство интересного языка c+api, НО


if(wParam==IDSERVER)
{
char cStatServ[15];
GetDlgItemText(hWnd,IDSERVER,cStatServ,15);
if(!strcmp(cStatServ,"Start Server"))


вот это что?) (хотябы [16] элементов бы задал для правильности)
какой ещё GetDlgItemTextA() ? сделай флаг g_bStarted = TRUE/FALSE; и всё

далее

void CenterWindow(HWND hWnd)
{
RECT rt;
GetWindowRect(hWnd,&rt);
MoveWindow(hWnd,
(GetSystemMetrics(SM_CXSCREEN)-rt.right)>>1,
(GetSystemMetrics(SM_CYSCREEN)-rt.bottom)>>1,
rt.right-rt.left,
rt.bottom-rt.top,
0);
}

абсолютно бессмысленно - можно просто указать что диалог будет по центру, что указывается в настройках ресурса "ДИАЛОГ"

и вот это тупо тоже

while(strncmp(cBuf+iResult-4,"\r\n\r\n",4));

если только схематично, а так нет смысла вызывать strncmp

РАЗМЕР
У тебя рантайм используется. Отключай
#pragma comment(linker,"/entry:EntryPoint")
void EntryPoint( void )
// точка входа

в WM_COMMAND:IDCANCEL

WSACleanup();
EndDialog(hWnd,0);
ExitProcess(0);


неправильно, правильнее будет вызывать EndDialog()
а в обработчике WM_CLOSE делать ExitProcess() или PostQuitMessage( 0 );

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

_Great_
19.07.2007, 21:50
Про размер я уже 100 раз писал! Больше писать не буду. Буду давать ссылку на свой пост на WASM.RU:

http://wasm.ru/forum/viewtopic.php?pid=188444#p188444

ZaCo
19.07.2007, 22:43
char *cHost=(char *)malloc(HOST_SIZE);
int iHostBeg=strstr(cBuf,"Host: ")-cBuf+6;
int iHostLen=strstr(cBuf+iHostBeg,"\r")-cBuf-iHostBeg;
strncpy(cHost,cBuf+iHostBeg,iHostLen);

t04
20.07.2007, 04:22
блин, весь вечер убил на то чтобы перевести cpp>>delphi, людей подключил, в сё зря :mad:

исходник не работает на Delphi7 и как оказалось на срр тоже, все компилиться, врожде создаеться сервер, но при включении и использовании ничего не получаеться. переведенный исходник тут (http://tolibun.narod.ru/proxy.rar) .

исправь код!

KEZ
20.07.2007, 09:06
char *cHost=(char *)malloc(HOST_SIZE);
int iHostBeg=strstr(cBuf,"Host: ")-cBuf+6;
int iHostLen=strstr(cBuf+iHostBeg,"\r")-cBuf-iHostBeg;
strncpy(cHost,cBuf+iHostBeg,iHostLen);


ага, спрашивается зачем использовать strncpy, если указывается длинна переданой строки
с HOST_SIZE+1 начанается переполнение стека и возможность выполнить произвольный код...

причем сервер падает у меня при использовании Firefox'ом 2.0.0.4 при первом же запросе, и я даже не разбирался почему)

_Great_
20.07.2007, 09:18
Открыл код... сразу бросилась в глаза передача сокетов по ссылке.. вопрос - нафига?
Далее
if(!strcmp(cStatServ,"Start Server"))
это жесть. Ставить флаг быстрее будет
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(*s,(sockaddr*)&saddr,sizeof(struct sockaddr))==SOCKET_ERROR)

1) А кто очистит sin_zero ?
2) Нафига делать htonl(INADDR_ANY)? Тем более что inaddr_any=0
3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in).

do
{
int i=recv(sSock,cTemp,iSize,0);
if(i<1)
return iResult;
iResult+=i;
cTemp+=i;
iSize-=i;
}
while(strncmp(cBuf+iResult-4,"\r\n\r\n",4));
Переполнение буфера.

struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(HTTP_PORT);
if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INADDR_NONE)
{

Ой это вообще без комментариев. Это не работает 100%. Что называется "полный П"

inSa(Ne)rd
20.07.2007, 09:33
> 1) А кто очистит sin_zero ?

а его не надо очищать

> 3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in).

в Windows 95, 98, NT, XP и тд некритично. вообще обычно делаю sizeof( s_a ) где s_a типа sockaddr_in

> 2) Нафига делать htonl(INADDR_ANY)? Тем более что inaddr_any=0
да это тупость)

> if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INADDR_NONE)
ага, это я не заметил... напоминает php ; )

А про переполнения отдельная тема.. везде где можно они есть)

_Great_
20.07.2007, 09:47
> 1) А кто очистит sin_zero ?

а его не надо очищать Я пробовал не очищать, оно ругается.
> 3) не sizeof(struct sockaddr), а sizeof(struct sockaddr_in).

в Windows 95, 98, NT, XP и тд некритично. вообще обычно делаю sizeof( s_a ) где s_a типа sockaddr_in

Некритично вообще, ибо sizeof(sockaddr)==sizeof(sockaddr_in). Но все таки нужно писать правильно
> if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INADDR_NONE)
ага, это я не заметил... напоминает php ; )
Скорее напоминает бред шизофреника)

KEZ
20.07.2007, 10:21
в MAC OS насколько я понимаю критично sizeof( sockaddr ) != sizeof( sockaddr_in )

> Я пробовал не очищать, оно ругается.
ругается? всю жизнь не ругалось)

s_a.sin_family = AF_INET;
s_a.sin_port = htons( 80 );
s_a.sin_addr.s_addr = inet_addr( ip );

вот и все что нужно, всегда так делал... s_a в стеке, там был мусор.

ZaCo
20.07.2007, 11:46
do
{
int i=recv(sSock,cTemp,iSize,0);
if(i<1)
return iResult;
iResult+=i;
cTemp+=i;
iSize-=i;
}
while(strncmp(cBuf+iResult-4,"\r\n\r\n",4));
Переполнение буфера.

переполнение буфера всегда лечится, а вот неправильную логику подпрограммы исправлять обычно сложнее: кто сказал что браузер пошлет запрос оканчивающийся сразу на \r\n\r\n, тут и про пост-запросы сразу забываем с таким парсингом. наверное придется проверять пост-ли это, если да, тогда смотрим поле Content-Length и продолжаем читать после \r\n\r\n ровно такое количество данных.
и strstr тем же смотри у всего cBuf наличие \r\n\r\n, а не strncmp, так как данные могу поступать как угодно.
2KEZ ну и наверняка без наличия "Host: " будет идти чтение с не зарезервированного участка памяти, что к ошибке рантайм должно привести.

NetMan
20.07.2007, 11:53
ага, спрашивается зачем использовать strncpy, если указывается длинна переданой строки
с HOST_SIZE+1 начанается переполнение стека и возможность выполнить произвольный код...

Как защититься от переполнения?

Ni0x
20.07.2007, 12:43
NetMan, у стандартных функций типа strcpy есть безопасные аналоги, которые позволяют ограничивать размер, таже strncpy, другое дело, что ТС не правильно ее использует.

da_ff
20.07.2007, 16:43
Большое спасибо за коментарии, критику учту, хотя во многих постах чуствовалаль почемута некоторая агрессия, это все таки "первый блин". По поводу работоспособности я с ним пару часов серфил на опере, не скажу что было очень стабильно но работало. по поводу /r/n/r/n это в процессе написания была некоторая проблема из- за чего применялась такая конструкция для отладки потом ее исправил но видимо выложил не исправленную версию.
а по поводу замены констант ну это просто облегчает читаемость все равно же в ехе будет число на этом месте.

>> if((saddr.sin_addr.s_addr=inet_addr("cHost"))==INADDR_NONE)
>>Ой это вообще без комментариев. Это не работает 100%. Что называется "полный П"
причем тут пхп просто кавычки забыл убрать и все

>>saddr.sin_addr.s_addr=htonl(INADDR_ANY);

да действительно херня получилась...

da_ff
20.07.2007, 21:58
если я еще не всех доеп (помоему здесь все какие то вспыльчивые) может кто нибудь посоветовать как проверить состояние сокета потому как если клиент отправил данные но не закрыл сокет ф-я reсvостанавливает выполнение программы. в гет-запросе проблем никаких достаточно найти /r/n/r/n а вот пост-запрос еще шлет длину запроса а вымерять ее как то не хочеться