Release HttpProxyServer

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by da_ff, 16 Jul 2007.

  1. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    Вот собсна решил наваять и выложить на общий суд
    -язык с+api
    -открывает 31337 порт
    -логов не ведет
    -весит мало ~10к (так я не понял откуда лишних 5к взялись а они лишние, точно)
    -исходники прилагаются

    HttpProxyServer
     
    #1 da_ff, 16 Jul 2007
    Last edited: 17 Jul 2007
    4 people like this.
  2. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    несколько человек добавили в репу с примерно следующим коментарием
    причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.
     
  3. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    > причем тут блокнот это первый опыт в сетевом кодинге я просил посмотреть и высказать мнения, указать слабые места, показать как лучше.

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

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

    хотя знаешь, тупости я в сорцах немного нашел. видимо это свойство интересного языка c+api, НО
    Code:
    
    		if(wParam==IDSERVER)
    		{
    			char cStatServ[15];
    			GetDlgItemText(hWnd,IDSERVER,cStatServ,15);
    			if(!strcmp(cStatServ,"Start Server"))
    
    вот это что?) (хотябы [16] элементов бы задал для правильности)
    какой ещё GetDlgItemTextA() ? сделай флаг g_bStarted = TRUE/FALSE; и всё

    далее
    Code:
    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);
    }
    
    абсолютно бессмысленно - можно просто указать что диалог будет по центру, что указывается в настройках ресурса "ДИАЛОГ"

    и вот это тупо тоже
    Code:
    while(strncmp(cBuf+iResult-4,"\r\n\r\n",4));
    
    если только схематично, а так нет смысла вызывать strncmp

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

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

    ещё нужно вызывать TerminateThread( hThread, 0 );
    иначе нахер ты сохраняешь хенлд созданого потока?
    и ещё, поставил бы ты таймауты на поток, обслуживающий клиент.
     
    #3 KEZ, 19 Jul 2007
    Last edited: 19 Jul 2007
  4. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Про размер я уже 100 раз писал! Больше писать не буду. Буду давать ссылку на свой пост на WASM.RU:

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

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    Code:
    	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);
    
     
    2 people like this.
  6. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    блин, весь вечер убил на то чтобы перевести cpp>>delphi, людей подключил, в сё зря :mad:

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

    исправь код!
     
  7. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    ага, спрашивается зачем использовать strncpy, если указывается длинна переданой строки
    с HOST_SIZE+1 начанается переполнение стека и возможность выполнить произвольный код...

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Открыл код... сразу бросилась в глаза передача сокетов по ссылке.. вопрос - нафига?
    Далее
    if(!strcmp(cStatServ,"Start Server"))
    это жесть. Ставить флаг быстрее будет
    Code:
    	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).

    Code:
    	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));
    Переполнение буфера.

    Code:
    	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%. Что называется "полный П"
     
  9. inSa(Ne)rd

    inSa(Ne)rd В Стране Чудес

    Joined:
    14 Mar 2005
    Messages:
    245
    Likes Received:
    1,369
    Reputations:
    168
    > 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 ; )

    А про переполнения отдельная тема.. везде где можно они есть)
     
    3 people like this.
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Я пробовал не очищать, оно ругается.
    Некритично вообще, ибо sizeof(sockaddr)==sizeof(sockaddr_in). Но все таки нужно писать правильно
    Скорее напоминает бред шизофреника)
     
  11. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    в 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 в стеке, там был мусор.
     
  12. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    переполнение буфера всегда лечится, а вот неправильную логику подпрограммы исправлять обычно сложнее: кто сказал что браузер пошлет запрос оканчивающийся сразу на \r\n\r\n, тут и про пост-запросы сразу забываем с таким парсингом. наверное придется проверять пост-ли это, если да, тогда смотрим поле Content-Length и продолжаем читать после \r\n\r\n ровно такое количество данных.
    и strstr тем же смотри у всего cBuf наличие \r\n\r\n, а не strncmp, так как данные могу поступать как угодно.
    2KEZ ну и наверняка без наличия "Host: " будет идти чтение с не зарезервированного участка памяти, что к ошибке рантайм должно привести.
     
  13. NetMan

    NetMan Elder - Старейшина

    Joined:
    9 Feb 2004
    Messages:
    121
    Likes Received:
    37
    Reputations:
    34
    Как защититься от переполнения?
     
  14. Ni0x

    Ni0x Elder - Старейшина

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    NetMan, у стандартных функций типа strcpy есть безопасные аналоги, которые позволяют ограничивать размер, таже strncpy, другое дело, что ТС не правильно ее использует.
     
  15. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    Большое спасибо за коментарии, критику учту, хотя во многих постах чуствовалаль почемута некоторая агрессия, это все таки "первый блин". По поводу работоспособности я с ним пару часов серфил на опере, не скажу что было очень стабильно но работало. по поводу /r/n/r/n это в процессе написания была некоторая проблема из- за чего применялась такая конструкция для отладки потом ее исправил но видимо выложил не исправленную версию.
    а по поводу замены констант ну это просто облегчает читаемость все равно же в ехе будет число на этом месте.

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

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

    да действительно херня получилась...
     
    #15 da_ff, 20 Jul 2007
    Last edited: 20 Jul 2007
  16. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    если я еще не всех доеп (помоему здесь все какие то вспыльчивые) может кто нибудь посоветовать как проверить состояние сокета потому как если клиент отправил данные но не закрыл сокет ф-я reсvостанавливает выполнение программы. в гет-запросе проблем никаких достаточно найти /r/n/r/n а вот пост-запрос еще шлет длину запроса а вымерять ее как то не хочеться
     
    1 person likes this.