Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Release HttpProxyServer (https://forum.antichat.xyz/showthread.php?t=44585)

da_ff 16.07.2007 21:25

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

HttpProxyServer

da_ff 18.07.2007 11:49

несколько человек добавили в репу с примерно следующим коментарием
Цитата:

Сообщение от kez
на*** релизить ***ню всякую? давай ещё блокнот напишем?

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

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 и как оказалось на срр тоже, все компилиться, врожде создаеться сервер, но при включении и использовании ничего не получаеться. переведенный исходник тут .

исправь код!

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"))==INA DDR_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"))==INA DDR_NONE)
ага, это я не заметил... напоминает php ; )
Скорее напоминает бред шизофреника)


Время: 21:15