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 ...
随机推荐
- 田螺便利店—win10专业版激活码
win10专业版:VP4MG-CMX8Q-27THR-Y468R-HRVR7 开始——设置——更新和安全——激活——更改产品密钥 复制VP4MG-CMX8Q-27THR-Y468R-HRVR7即可激活 ...
- HDU 1014 G题
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- tomcat部署成https协议
1 生成密匙:进入jdk的bin目录后输入: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keysto ...
- c++中的stl
String Vector Set List Map 1.string char* s1 = "Hello SYSU!"; //创建指针指向字符串常量,这段字符串我们是不能修改的 ...
- Damped Track 阻尼跟随
Damped Track 阻尼跟随 https://www.youtube.com/watch?v=pd1od5WPCUw 2个网格及对应的2个空对象Z轴方向网格:{O.up}; 上方园孔把手中间放空 ...
- 《DSP using MATLAB》Problem 7.1
只有春节那么几天才能和家人团聚,看着爸爸妈妈一年比一年老,自己还是一无所有,照顾好自己尚且惭愧,真是悲从中来,又能怎么办呢, 唯有奋发努力,时不我待,多想想怎么赚钱,加油. 代码: function ...
- python 基础的用法新发现
引用的发现: # 引用的处理 因为变量指的是某一内存地址 引用变量实际是引用一个固定的内存地址,# 当这个变量中的内容变了之后,他的内存地址不变, 所以引用者也动态的得到了变化的变量l1=[1,2,3 ...
- 使用distillery&&docker 部署phoenix 应用
distillery 发布了2.0 了,有好多的新的功能 config prodiver 进行环境变量的配置 appup tansforms 插件系统,方便在release 构建的时候进行修改 m ...
- antd、react-router-dom v4 解决菜单和地址同步问题
点击不同的菜单,右边内容做相应的变化. 不过,对于后退操作和刷新页面操作无效,左边菜单无法保持选中项高亮. 解决思路如下: Menu 用 seletedKeys 来决定哪项被选中.需要判断当前选前的路 ...
- maven的profile
https://elim.iteye.com/blog/1900568 简介:配置不同环境要使用的profile,再idea操作画面可以选