Security Breach2 отправка фоток в VK С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Four-F, 1 Apr 2017.

  1. Four-F

    Four-F Member

    Joined:
    1 Apr 2017
    Messages:
    9
    Likes Received:
    5
    Reputations:
    0
    Code:
    DWORD dwProtocol;
        CString sServer;
        CString sObjectName;
        INTERNET_PORT wPort;
        AfxParseURL(sUploadServer, dwProtocol, sServer, sObjectName, wPort);
    
        CString sHeader = L"Content-Type: multipart/form-data; boundary=w23renff491nc4rth56u349";   
        CString sData = L"--w23renff491nc4rth56u349\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"";   
        sData.Append(sFileName);
        if(sFileExt == "jpg")
        {
            sData.Append(L"\"\r\nContent-Type: image/jpeg\r\nContent-Transfer-Encoding: binary\r\n\r\n");
        }
        else if(sFileExt == "png")
        {
            sData.Append(L"\"\r\nContent-Type: image/png\r\nContent-Transfer-Encoding: binary\r\n\r\n");
        }
        else if(sFileExt == "gif")
        {
            sData.Append(L"\"\r\nContent-Type: image/gif\r\nContent-Transfer-Encoding: binary\r\n\r\n");
        }
    
        CString sBound = L"\r\n--w23renff491nc4rth56u349--\r\n";
    
        HINTERNET hSession, hConnect, hRequest;
        DWORD dwFileSize, dwBytesRead, dwContentLength;
        char aBuff[1024];
        char aBuff2[1024];
        char aBuff3[1024];
    
        hSession = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);       
        if (hSession)
        {
            hConnect = InternetConnect(hSession, sServer, wPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
            if (hConnect)
            {                   
                hRequest = HttpOpenRequest(hConnect, L"POST", sObjectName, HTTP_VERSION, NULL, 0, INTERNET_FLAG_SECURE | INTERNET_FLAG_KEEP_CONNECTION, 0);
                if (hRequest)
                {
                    HANDLE hFile = CreateFile(sPathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
                    if (hFile != INVALID_HANDLE_VALUE)
                    {       
                        dwFileSize = GetFileSize(hFile, NULL);
                        int nBytesCount = ::WideCharToMultiByte(CP_UTF8, 0, sHeader, sHeader.GetLength(), aBuff, 1024, 0, 0);
                        aBuff[nBytesCount] = 0;
                        nBytesCount = ::WideCharToMultiByte(CP_UTF8, 0, sData, sData.GetLength(), aBuff2, 1024, 0, 0);
                        aBuff2[nBytesCount] = 0;
                        nBytesCount = ::WideCharToMultiByte(CP_UTF8, 0, sBound, sBound.GetLength(), aBuff3, 1024, 0, 0);
                        aBuff3[nBytesCount] = 0;
                        dwContentLength = lstrlenA(aBuff2) + dwFileSize + lstrlenA(aBuff3);
                        LPBYTE pBuf = (LPBYTE)malloc(dwContentLength);
                        CopyMemory(&pBuf[0], aBuff2, lstrlenA(aBuff2));
                        ReadFile(hFile, &pBuf[lstrlenA(aBuff2)], dwFileSize, &dwBytesRead, NULL);
                        CopyMemory(&pBuf[lstrlenA(aBuff2) + dwFileSize], aBuff3, lstrlenA(aBuff3));
                        HttpSendRequestA(hRequest, aBuff, lstrlenA(aBuff), pBuf, dwContentLength);                   
                        CloseHandle(hFile);
                        free(pBuf);
    
                        DWORD dwAvailable, dwRead;
                        char pOutBuf[2048];
                        char* pTempBuf = pOutBuf;
                        while(InternetQueryDataAvailable(hRequest, &dwAvailable, 0, 0) && dwAvailable != 0)
                        {
                            DWORD dwRead;
                            InternetReadFile(hRequest, pTempBuf, dwAvailable, &dwRead);
                            pTempBuf += dwRead;
                        }
                    }
                }
                InternetCloseHandle(hRequest);
            }
            InternetCloseHandle(hConnect);
        }
        InternetCloseHandle(hSession);
    Доброго времени суток. Подскажите, пожалуйста, что не так. Загрузка фотографии в личное сообщение. В ответ - Security Breach2.
     
  2. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Я вижу здесь лишнюю кавычку \"
     
  3. Four-F

    Four-F Member

    Joined:
    1 Apr 2017
    Messages:
    9
    Likes Received:
    5
    Reputations:
    0
    Кавычка после имени файла. В C# такой запрос проходит. Сдается мне, что сервера VK не работают с WinInet.
     
  4. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    ВК не сможет определить, используете ли вы библиотеку WinInet или какую-то другую. Всё зависит от тела запроса, используйте Wireshark чтобы видеть, что там реально передаётся (если конечно не https).
     
  5. Four-F

    Four-F Member

    Joined:
    1 Apr 2017
    Messages:
    9
    Likes Received:
    5
    Reputations:
    0
    В VK все запросы по https. Я думаю, что дело в реализации протокола https WinInet. В C# же запрос проходит... Даже если убрать из тела запроса фотографию, все равно возвращает Security Breach2, хотя должен вернуть ответ с пустым полем photo.
     
  6. Four-F

    Four-F Member

    Joined:
    1 Apr 2017
    Messages:
    9
    Likes Received:
    5
    Reputations:
    0
    Написал в тех. поддержку вконтакте. Говорят, что WinInet высылает неверные заголовки. Интересно, что если отправить по http, тоже Security Breach2. Вот, что видно в Wireshark. Может найдется кто-то, кто скажет, что здесь не так?

    Code:
    Hypertext Transfer Protocol
        POST /c638418/upload.php?act=do_add&mid=194941606&aid=-3&gid=0&hash=b7818729913a4b849c88f9319eceeaa5&rhash=359a8b078fd7ea5da75a948fa3be0fe0&swfupload=1&api=1&mailphoto=1 HTTP/1.1\r\n
        Content-Type: multipart/form-data; boundary=w23renff491nc4rth56u349\r\n
        Host: pu.vk.com\r\n
        Content-Length: 105263\r\n
        Connection: Keep-Alive\r\n
        Cache-Control: no-cache\r\n
        \r\n
        [Full request URI: http://pu.vk.com/c638418/upload.php?act=do_add&mid=194941606&aid=-3&gid=0&hash=b7818729913a4b849c88f9319eceeaa5&rhash=359a8b078fd7ea5da75a948fa3be0fe0&swfupload=1&api=1&mailphoto=1]
        [HTTP request 2/2]
        File Data: 105263 bytes
    MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "w23renff491nc4rth56u349"
        [Type: multipart/form-data]
        First boundary: --w23renff491nc4rth56u349\r\n
        Encapsulated multipart part:  (image/jpeg)
        Last boundary: \r\n--w23renff491nc4rth56u349--\r\n
    
     
  7. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Амперсанды экранированы?
     
    Four-F likes this.
  8. Four-F

    Four-F Member

    Joined:
    1 Apr 2017
    Messages:
    9
    Likes Received:
    5
    Reputations:
    0
    Спасибо большое! Заработало.