基于WinInet的HTTP与HTTPS数据传输上传与下载的对比总结

Coquettish

发布日期: 2018-12-23 14:31:41 浏览量: 854
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

背景

之前就是用WinInet库写了HTTP文件上传和下载以及HTTPS文件上传和下载的小程序,现在,要特意写一篇文章来总结HTTP和HTTPS之间文件上传和文件下载之间的异同点。当然,本文只是从编程开发的角度进行总结,并不是从协议本身去比较。

HTTP与HTTPS文件下载的异同点

操作 HTTP文件下载 HTTPS文件下载 异或同
建立会话 ::InternetOpen(“WinInetGet/0.1”, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ::InternetOpen(“WinInetGet/0.1”, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 相同
建立连接 :InternetConnect(hInternet, szHostName, INTERNET_DEFAULT_HTTP_PORT, szUserName, szPassword, INTERNET_SERVICE_HTTP, 0, 0); ::InternetConnect(hInternet, szHostName, INTERNET_DEFAULT_HTTPS_PORT, szUserName, szPassword, INTERNET_SERVICE_HTTP, 0, 0); 端口有区别
打开请求 dwOpenRequestFlags = INTERNET_FLAG_IGNORE_RE DIRECT_TO_HTTP|INTERNET_FLAG_KEEP_CON NECTION|INTERNET_FLAG_NO_AUTH|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI; dwOpenRequestFlags = INTERNET_FLAG_IGNORE_RE DIRECT_TO_HTTP|INTERNET_FLAG_KEEP_CON NECTION|INTERNET_FLAG_NO_AUTH|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI|INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_RELOAD; 请求标志不同
发送请求 ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); dwFlags = dwFlags|SECURITY_FLAG_IGNORE_UNKNOWN_CA; ::InternetSetOption(hRequest, INTERNET_OPTION_SECUR ITY_FLAGS, &dwFlags, sizeof(dwFlags)); ::HttpSendRequest(hRequest, NULL, 0, NULL, 0); HTTPS需要设置忽略未知的证书颁发机构
接收响应信息头 ::HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, pResponseHeaderIInfo, &dwResponseHeaderIInfoSize, NULL); ::HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, pResponseHeaderIInfo, &dwResponseHeaderIInfoSize, NULL); 相同
接收数据 ::InternetReadFile(hRequest, pBuf, dwBufSize, &dwRet); ::InternetReadFile(hRequest, pBuf, dwBufSize, &dwRet); 相同
关闭句柄 ::InternetCloseHandle(hRequest); ::InternetCloseHandle(hConnect); ::InternetCloseHandle(hInternet); ::InternetCloseHandle(hRequest); ::InternetCloseHandle(hConnect); ::InternetCloseHandle(hInternet); 相同

HTTP与HTTPS文件上传的异同点

操作 HTTP文件上传 HTTPS文件上传 异或同
建立会话 ::InternetOpen(“WinInetGet/0.1”, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ::InternetOpen(“WinInetGet/0.1”, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 相同
建立连接 :InternetConnect(hInternet, szHostName, INTERNET_DEFAULT_HTTP_PORT, szUserName, szPassword, INTERNET_SERVICE_HTTP, 0, 0); ::InternetConnect(hInternet, szHostName, INTERNET_DEFAULT_HTTPS_PORT, szUserName, szPassword, INTERNET_SERVICE_HTTP, 0, 0); 端口有区别
打开请求 dwOpenRequestFlags = INTERNET_FLAG_IGNORE_RE DIRECT_TO_HTTP|INTERNET_FLAG_KEEP_CON NECTION|INTERNET_FLAG_NO_AUTH|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI; dwOpenRequestFlags = INTERNET_FLAG_IGNORE_RE DIRECT_TO_HTTP|INTERNET_FLAG_KEEP_CON NECTION|INTERNET_FLAG_NO_AUTH|INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_NO_UI|INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID|INTERNET_FLAG_RELOAD; 请求标志不同
附加请求头(可写可不写) ::HttpAddRequestHeaders(hRequest, szRequestHeaders, ::lstrlen(szRequestHeaders), HTTP_ADDREQ_FLAG_ADD); ::HttpAddRequestHeaders(hRequest, szRequestHeaders, ::lstrlen(szRequestHeaders), HTTP_ADDREQ_FLAG_ADD); 相同
发送请求 ::HttpSendRequestEx(hRequest, &internetBuffers, NULL, 0, 0); dwFlags = dwFlags|SECURITY_FLAG_IGNORE_UNKNOWN_CA; ::InternetSetOption(hRequest, INTERNET_OPTION_SECUR ITY_FLAGS, &dwFlags, sizeof(dwFlags)); ::HttpSendRequestEx(hRequest, &internetBuffers, NULL, 0, 0); HTTPS需要设置忽略未知的证书颁发机构
发送数据数据 ::InternetWriteFile(hRequest, pUploadData, dwUploadDataSize, &dwRet); ::InternetWriteFile(hRequest, pUploadData, dwUploadDataSize, &dwRet); 相同
结束数据请求 ::HttpEndRequest(hRequest, NULL, 0, 0); ::HttpEndRequest(hRequest, NULL, 0, 0); 相同
关闭句柄 ::InternetCloseHandle(hRequest); ::InternetCloseHandle(hConnect); ::InternetCloseHandle(hInternet); ::InternetCloseHandle(hRequest); ::InternetCloseHandle(hConnect); ::InternetCloseHandle(hInternet); 相同

总结

由上述的对比可知,HTTPS可基于HTTP上修改得到。它们的区别主要是体现在 3 点上:

  • 使用的连接端口不同;HTTP使用的是INTERNET_DEFAULT_HTTP_PORT也就是80端口;HTTPS使用的是INTERNET_DEFAULT_HTTPS_PORT,也就是443端口。

  • 请求标志不同;

    HTTP的请求标志有:

    1. INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
    2. INTERNET_FLAG_KEEP_CONNECTION
    3. INTERNET_FLAG_NO_AUTH
    4. INTERNET_FLAG_NO_COOKIES
    5. INTERNET_FLAG_NO_UI

    HTTPS的请求标志在HTTP的基础上,还增加多 3 个:

    1. INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
    2. INTERNET_FLAG_KEEP_CONNECTION
    3. INTERNET_FLAG_NO_AUTH
    4. INTERNET_FLAG_NO_COOKIES
    5. INTERNET_FLAG_NO_UI
    6. // HTTPS SETTING
    7. INTERNET_FLAG_SECURE
    8. INTERNET_FLAG_IGNORE_CERT_CN_INVALID
    9. INTERNET_FLAG_RELOAD
  • 发送请求的返回处理不同;HTTP若返回错误,则直接退出;而HTTPS若返回错误,则判断错误的类型是否是ERROR_INTERNET_INVALID_CA,然后设置忽略未知的证书颁发机构的安全标识,确保访问到一些使用自签名证书的HTTPS的网站。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件

发送私信

童心未泯,是一件值得骄傲的事情

28
文章数
18
评论数
最近文章
eject