vc++使用cookie登录网站
以http://www.idc816.com为例
效果图:
1)先登录获取cookie,再使用cookie获取用户信息

2)记录cookie,关闭程序后重新运行程序,直接获取用户信息

使用Fiddler抓包分析:

由于IWinHttpRequest对象会自动处理302跳转,但是服务器返回的cookie(Set-Cookie)正好在响应头中,因此需要设置取消IWinHttpRequest的自动重定向功能
通过put_option函数进行设置WinHttpRequestOption_EnableRedirects项为VARIANT_FALSE
此外,默认情况下WinHttpRequest会自动将服务器返回的 Set-Cookie信息设置到当前WinHttpRequest对象的Header上面,下次当访问相同域的网址时会自动带上对应的Cookie

代码:
#import "C:\\Windows\\System32\\winhttp.dll" no_namespace #define GET_WINHTTP_RESPONSE_STRING(IWinHttpRequestPtr_Obj, CString_Obj) \
{\
_variant_t varRspBody = IWinHttpRequestPtr_Obj->ResponseBody; \
char *pContentBuffer = (char*)varRspBody.parray->pvData; \
CString_Obj = pContentBuffer; \
} CString Get_Recv_Cookie(const CString &respHeader)
{
CString cookie;
CString key = _T("Set-Cookie:");
int iBegin = , iEnd = ;
while (iBegin < respHeader.GetLength())
{
iBegin = respHeader.Find(key, iBegin);
if (iBegin >= ) // 找到
{
iEnd = respHeader.Find(_T("\r\n"), iBegin);
if (iEnd >= )
{
cookie += respHeader.Mid(iBegin, iEnd - iBegin + ); // 包括换行
iBegin = iEnd;
}
}
else {
break;
}
}
return cookie;
} // 登录
void CHttpLoginWithCookieTestDlg::OnBnClickedButtonLogin()
{
// 获取用户名,密码
CString username, passwd;
GetDlgItemText(IDC_EDIT_NAME, username);
GetDlgItemText(IDC_EDIT_PASSWD, passwd);
if (username.IsEmpty() || passwd.IsEmpty())
{
MessageBox(_T("用户名或者密码为空"));
return;
} IWinHttpRequestPtr pHttpReq = NULL;
HRESULT hr = pHttpReq.CreateInstance(__uuidof(WinHttpRequest));
if (FAILED(hr))
return; // 建立连接
hr = pHttpReq->Open(_T("POST"), _T("http://www.idc816.com/chklogin.asp"));
if (FAILED(hr))
return; // post数据此项必须设置
pHttpReq->SetRequestHeader(_T("Content-Type"), _T("application/x-www-form-urlencoded")); // 取消自动处理302重定向,是为了获取响应头中的Set-Cookie
COleVariant varRedirect = VARIANT_FALSE;
pHttpReq->put_Option(WinHttpRequestOption_EnableRedirects, varRedirect);
// pHttpReq->Option[WinHttpRequestOption_EnableRedirects] = VARIANT_FALSE; CString body;
body.Format(_T("u_name=%s&u_password=%s&imageField.x=29&imageField.y=9"), username, passwd);
COleVariant varBody = body;
hr = pHttpReq->Send(varBody);
if (FAILED(hr))
return; CString respStr;
GET_WINHTTP_RESPONSE_STRING(pHttpReq, respStr); long statusCode = pHttpReq->Status;
if (statusCode == && respStr.Find(_T("/Manager/")) != -)
{
// 获取响应头
CString respHeader = pHttpReq->GetAllResponseHeaders();
// 获取cookie
CString cookie = Get_Recv_Cookie(respHeader);
// 显示cookie, 需要将输入框的Multiline属性设为True
SetDlgItemText(IDC_EDIT_COOKIE_RECV, cookie); MessageBox(_T("登录成功")); }
else
{
MessageBox(_T("登录失败"));
}
} // 获取信息
void CHttpLoginWithCookieTestDlg::OnBnClickedButtonInfo()
{
IWinHttpRequestPtr pHttpReq = NULL;
HRESULT hr = pHttpReq.CreateInstance(__uuidof(WinHttpRequest));
if (FAILED(hr))
return; hr = pHttpReq->Open(_T("GET"), _T("http://www.idc816.com/manager/usermanager/default2.asp"));
if (FAILED(hr))
return; // 从输入框中获取cookie
CString cookie;
GetDlgItemText(IDC_EDIT_COOKIE_SEND, cookie);
// 设置cookie
if (cookie.GetLength() > )
pHttpReq->SetRequestHeader(_T("Cookie"), cookie.GetString()); hr = pHttpReq->Send();
if (FAILED(hr))
return; CString respStr;
GET_WINHTTP_RESPONSE_STRING(pHttpReq, respStr); CString company, tel, qq;
company = getMidStrByLeftAndRight(respStr, _T("name=u_company value=\""), _T("\""));
tel = getMidStrByLeftAndRight(respStr, _T("name=u_telphone value=\""), _T("\""));
qq = getMidStrByLeftAndRight(respStr, _T("name=qq value=\""), _T("\""));
SetDlgItemText(IDC_STATIC_COMPANY, company);
SetDlgItemText(IDC_STATIC_TEL, tel);
SetDlgItemText(IDC_STATIC_QQ, qq);
} CString CHttpLoginWithCookieTestDlg::getMidStrByLeftAndRight(const CString &str, const CString &left, const CString &right)
{
CString ret;
int posLeft = -, posRight = -;
posLeft = str.Find(left);
if (posLeft == -)
return ret; posLeft += left.GetLength(); // 所求字符串的起始位置
posRight = str.Find(right, posLeft); // 所求字符串的结束位置
if (posRight == -)
return ret;
ret = str.Mid(posLeft, posRight - posLeft);
return ret; }
vc++使用cookie登录网站的更多相关文章
- js利用cookie登录网站
如上图,我们获取到了cookie,接下来利用cookie登录相应的网站. 我用的浏览器是火狐,首先在特定的网站(也就是我们发现XSS漏洞的网站,这里指的是pikachu)F12打开开发者工具,找到控制 ...
- vc++post方式登录网站
以http://www.idc3389.com为例: 效果图: 使用Fiddler工具进行抓包,截图: 可以发现: 1.并没有使用cookie并没有用作用户身份识别,因为登录前后的cookie并没有发 ...
- 用libcurl 登录网站
libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...
- c#使用WebClient登录网站抓取登录后的网页
C#登录网站实际上就是模拟浏览器提交表单,然后记录浏览器响应返回的会话Cookie值,再次发送请求时带着这个会话cookie值去请求就可以实现模拟登录的效果了. 如下类CookieAwareWebCl ...
- JMeter学习-012-JMeter 配置元件之-HTTP Cookie管理器-实现 Cookie 登录
前文我们讲过了若何获取登录后的 Cookie 信息,不知如何获取登录 Cookie 的朋友,敬请参阅我之前写的博文:Fiddler-005-获取 Cookie 信息.参阅上篇文章,获取到 Cookie ...
- Winform模拟post请求和get请求登录网站
引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的相关信息的封装,然后请求网站登录地址的样子.发现自己的博客中对这部分只是也没总结,就借着这股 ...
- python 携带cookie访问网站(python接口测试post)
最近在使用自己研究性能测试工具的时候想到,使用python向服务器不断发送数据以作为并发测试.大概情况如下: #coding=utf-8 import urllib2 import urllib im ...
- python3爬虫 - 利用浏览器cookie登录
http://blog.csdn.net/pipisorry/article/details/47980653 爬虫爬网站不免遇到需要登录的问题. 登录的时候可能还会碰到需要填验证码的问题, 有的验证 ...
- python3爬虫 - cookie登录实战
http://blog.csdn.net/pipisorry/article/details/47948065 实战1:使用cookie登录哈工大ACM网站 获取网站登录地址 http://acm.h ...
随机推荐
- vmware如何安装ubuntu
一.安装vamware 二.新建虚拟机 三.安装虚拟机的镜像文件 三.正式安装ubuntu 可能会出现的问题有: 下面为百度上的方法: 敲重点: 倘若按照网上的方法:关机重启按F2无法进入BIOS.则 ...
- hdoj-1068(二分图的最小点覆盖)
题目 1 问题转化: 求二分图最小点覆盖(覆盖所有的边) 2 问题的解决: 二分图最小点覆盖==其最大匹配数 3 证明: 链接 =#include <bits/stdc++.h> ...
- HDU 3635:Dragon Balls(并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- nginx根据url中的参数进行转发
在实际项目中,由于https安全策略,我们无法直接跳转到我们想要跳转到的地址 例如 url:https://abc.dc.com/image?url=https://vpic.video.qq.com ...
- find 以及linux 和windows 文件互传
1. find 命令 查找文件或目录 同时也会用到的有 which whereis locate 经常也会遇到一些快捷键 ctrl + l e a w u k ...
- PostgreSQL的配置文件
PostgreSQL的配置文件主要有如下3个(postgresql.conf,pg_hba.conf,pg_ident.conf)可以通过如下方式查找:postgres=# select name, ...
- Python 3 运行 shell 命令
#python 3.5 , win10 引入包 #os.chdir('path') import osimport subprocess #https://docs.python.org/3.5/li ...
- 【BZOJ1082】【SCOI2005】栅栏
暴力出奇迹…… 原题: 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木 ...
- 【mysql】创建索引
一.联合唯一索引 项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:t_aa 表中有aa,bb两个字段,如果不希望有2条 ...
- MySQL--NUMA与MySQL
============================================================= NUMA(Non-Uniform Memory Access),非一致性内存 ...