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 ...
随机推荐
- 论Injection的前世今生
Click me~ why Java EE provides injection mechanisms that enable your objects to obtain references to ...
- HPU组队赛B:问题(二进制枚举)
时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...
- tomcat部署成https协议
1 生成密匙:进入jdk的bin目录后输入: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keysto ...
- SpringMVC整合Thymeleaf
Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...
- BZOJ1494 [NOI2007]生成树计数
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- Java(控制台输出)实现猜数字小游戏
import java.util.Scanner; import java.util.Random; public class GuestNum{ public static void main(St ...
- Cassandra--设置数据保留时间
在Cassandra中,可以设置列的保留时间(Time To Live),当该列超过保留时间后,会下一次读取中被墓碑(Tombstone)标记,然后保留一个垃圾回收周期(表属性gc_grace_sec ...
- linux 条件
1.文件状态测试-d 目录 -r 可读-f 常规文件 -w 可写-L 符号连接 -x 可执行-s 文件长度大于0,非空 -u 文件有suid位设置 示例: [ -s haison.c ] 0表示成功, ...
- 新建 django 项目
安装 django ,就不必多说,python 环境是 python 3.6,django 安装的命令为: pip3 install django==2.1.7 开始demo,名字为 guest dj ...
- ubuntu 16.04卸载不必要的默认安装软件
两个办法,一个在ubuntu软件里一个一个删,明显的windows下做法. 还有一个通过终端来删除.ctrl+alt+t打开终端. 1.卸载libreoffices(要删一起删了,然后去装office ...