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 ...
随机推荐
- day021python 正则表达式
正则表达式是由普通字符和元字符组成, 普通字符包含大小写字母, 数字. 在匹配普通字符 的时候我们直接写就可以了. 比如"abc" 匹配的就是"abc". 元字 ...
- PTA——数列求和
PTA 7-34 求分数序列前N项和 #include<stdio.h> int main() { int i,n; ,fm = ,sum = ; scanf("%d" ...
- Python算法——递归思想
编程语言在构建程序时的基本操作有:内置数据类型操作.选择.循环.函数调用等,递归实际属于函数调用的一种特殊情况(函数调用自身),其数学基础是数学归纳法.递归在计算机程序设计中非常重要,是许多高级算法实 ...
- difference among String,StringBuilder,StringBuffer
difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...
- python django day 2
django-admin.py startproject zqxt_viewscd zqxt_viewspython manage.py startapp calczqxt_views/urls.py ...
- Node学习笔记:建立TCP服务器和客户端之间的通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- Scala下划线_使用
下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...
- Jmeter的NON-GUI模式
一般来讲,Jmeter执行压测,都是用Jmeter的命令模式,脚本调试好, 测试脚本能够大大缩减所需要的系统资源. 1.1命令介绍: jmeter -n -t <testplan filenam ...
- python之路---05 字典 集合
二十.字典 可变数据类型 {key:value}形式 查找效率高 key值必须是不可变的数据类型 1.增删改查 1).增 dic["新key"] = "新v ...
- js对象的key类型
http://javascript.ruanyifeng.com/grammar/object.html#toc2 对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加 ...