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 ...
随机推荐
- MySQL主从、环境搭建、主从配制
1. MySQL主从介绍 2.环境搭建 2.主从配制:修改主配制文件:vim /etc/my.cnf添加: server_id = ###log_bin = diy_name然后保存重启:/ ...
- hdu3746 Cyclic Nacklace KMP
CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...
- draw graph
http://www.icl.pku.edu.cn/member/yujs/bsdfiles/html/mpost.htmlUNIX下绘图面面观 http://www.tug.org/metapost ...
- putty登陆sourceforge.net(密钥的设置)
现在直接启动putty.exe是不能登陆sourceforge.net 的.按vps的方式,输入地址.用户名和密码后,程序就自动关闭.在登入前需要安装密匙,具体做法如下: 首先得生成一个SSH Key ...
- 一篇文章看懂java反射机制(反射实例化对象-反射获得构造方法,获得普通方法,获得字段属性)
Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到C ...
- vue-cli、create-react-app 项目如何查看打包分析?
vue-cli.create-react-app 项目如何查看打包分析? 项目 如何查看打包分析 vue-cli 创建的项目 已经集成 webpack-bundle-analyzer,运行npm ru ...
- gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
首先,这些C函数,在VS上要加_s后缀的原因是,这些函数存在字符串越界等问题,可以参考这篇文章,https://blog.csdn.net/silleyj/article/details/854540 ...
- centos7数据库连接使用127.0.0.1报permission denied,使用localhost报No such file or directory
安装lamp环境后,测试数据库连接. 当host使用127.0.0.1时,报错:(HY000/2002): Permission denied. 把host换成localhost后,又报错:SQLST ...
- Docker 制作自己的镜像
1. 下载tomcat镜像 docker pull hub.c.163.com/library/tomcat:latest 2. 创建Dockfile vi Dockerfile from hub.c ...
- 深入理解ASP.NET MVC(5)
系列目录 回顾 系列的前4节深入剖析了ASP.NET URL路由机制,以及MVC在此基础上是如何实现Areas机制的,同时涉及到inbound和outbound很多细节部分.第2节中提到MvcRout ...