Авторизация на сайте с помощью c++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kraneg, 20 Jan 2009.

  1. Kraneg

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

    Joined:
    30 Aug 2008
    Messages:
    107
    Likes Received:
    97
    Reputations:
    21
    Пытаюсь авторизоваться с помощью си++ на сайте... Начну как бы с того что если запрос для авторизации я должен посылать такой:
    Code:
    POST /index.php HTTP/1.1
    User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0
    Host: test2.ru
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*
    Accept-Language: ru-RU,ru;q=0.9,en
    Accept-Charset: iso-8859-1, utf-8, utf-16, *
    Accept-Encoding: deflate, gzip, x-gzip, identity, *
    Referer: http://test2.ru/
    Proxy-Connection: Keep-Alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 74
    referer=%2F&action=dologin&username=123&password=123
    
    то если так и посылать то будет жаловаться на строчку
    referer=2F&action=dologin&username=123&password=123 и в ответ куки не придут...
    а если менять первую строчку на
    POST /index.php?action=dologin&username=123&password=123 HTTP/1.1\n
    и referer удалить то все пройдет норм и в ответ придет странчка из которой уже можно выцепить кукисы.... =) Так вот в чем вопрос так и надо или я вообще все не правильно делаю? И еще не мог бы кто ни будь привести примеры авторизации с помощью си на сайте... Просто именно с этим столкнулся впервые и что то не допонимаю...


    p.s. мой код не до конца доделанный...
    Code:
    #include "stdafx.h"
    #include "winsock2.h"
    #include <stdio.h>
    #include <fstream>
    #include <string.h>
    #pragma comment(lib, "WSOCK32.lib")
    
    using namespace std;
    
    //функция вывода ответа сервера в файл
    int recvtofile(char recvbuf[99999])
    {
    	ofstream outfile;
    	outfile.open("recv_log.txt");
    	outfile.write(recvbuf,strlen(recvbuf));
    	return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        WSADATA wsaData;
    
        if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
        {
            printf("Error at WSAStartup()\n");
    
            getchar();
            return 0;
        }
    
        SOCKET ConnectSocket;
    
        ConnectSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(ConnectSocket == INVALID_SOCKET)
        {
            printf("Error at socket(): %ld\n", WSAGetLastError());
            WSACleanup();
    
            getchar();
            return 0;
        }
    
        sockaddr_in clientService;
    
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
        clientService.sin_port = htons(80);
    
        if(connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
        {
            printf("Failed to connect.\n");
            WSACleanup();
    
            getchar();
            return 0;
        }
    	else
    	{
    		printf("Conect to server... OK! \n");
    	}
    
        int bytesSent;
        int bytesRecv = 0;
        char sendbuf1[] = 
    				"POST /index.php?action=dologin&username=123&password=123 HTTP/1.1\n"
    				"User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0\n"
    				"Host: test2.ru\n"
    				"Proxy-Connection: Keep-Alive\n"
    				"\n";
        char recvbuf[99999] = "";
    	bytesSent = send(ConnectSocket, sendbuf1, strlen(sendbuf1), 0);
        printf("Bytes Sent: %ld\n", bytesSent);
        bytesRecv = recv(ConnectSocket, recvbuf, 99999, 0);
        printf( "Bytes Recv: %ld\n", bytesRecv );
    
    
        closesocket(ConnectSocket);
        WSACleanup();
    
        getchar();
    
        return 0;
    }
    
    после этого в recvbuf можно выцепить те самые куки... Вопрос правильно ли?


    Неужели никто не знает ответ? =\
     
    #1 Kraneg, 20 Jan 2009
    Last edited: 20 Jan 2009
  2. dnd

    dnd Member

    Joined:
    28 Nov 2007
    Messages:
    23
    Likes Received:
    8
    Reputations:
    0
    после Content-Length надо вроде строчку проспускать (\n\n)
    Можешь через WinInet делать - тогда даже выцеплять куки не надо будет - они сами приделаются и при следущем запросе к сайту ты уже будешь авторизован
     
    1 person likes this.
  3. groundhog

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

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Совершенно верно

    Code:
    POST /index.php HTTP/1.1
    User-Agent: Opera/10.00 (Windows NT 6.0; U; en) Presto/2.2.0
    Host: test2.ru
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*
    Accept-Language: ru-RU,ru;q=0.9,en
    Accept-Charset: iso-8859-1, utf-8, utf-16, *
    Accept-Encoding: deflate, gzip, x-gzip, identity, *
    Referer: http://test2.ru/
    Proxy-Connection: Keep-Alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 74
    
    referer=%2F&action=dologin&username=123&password=123
    И необходимо следить за тем, чтобы Content-Length был равен длине тела пост-запроса (включая и непечатные символы).

    У меня такое впечатление, что ты не знаешь что такое кукисы и где они передаются... При чём тут "выцеплять из странички"? Кукисы передаются в заголовке ответа в поле Set-Cookie...
     
    1 person likes this.