VC POST表单——登录验证新浪邮箱
1、本机环境:
Windows XP SP3、ADSL
2、开发工具:
WildPackets OmniPeek V5.1.4
Visual C++ 6.0
IE6.0
FlexEdit V2.3.1871
假设认为OmniPeek文件太大不方面下载的朋友,能够使用开源的简易抓包分析工具,先登录codeproject,再单击此处開始下载或邮件给我索取源代码 (ningyusky@tom.com 或 koma0769@vip.qq.com)
注意:假设没有登录codeproject的话是无法下载的,你能够自行改动该工具源代码,将每一步GET、POST等动作的数据所有记录于某文件,以便查看分析之.....
我就是如此,由于我的硬件配置不是非常“主流”的,所以每次OmniPeek启动和新建project时,电脑都快要死机.....
3、程序执行效果:

4、源代码说明:
虽如此短短一百余行的代码,但我在debug下调试了三个多小时才攻克了这里每一处存在或可能存在的错误,希望能够与大家交流共同探讨......
/************************************************************************/
/* 函数说明:模拟POST表单——登录新浪邮箱
/* 參 数:无
/* 返 回 值:无
/* By:Koma 2009.10.16 10:18
/************************************************************************/
void CSinaDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
if(m_strUser.IsEmpty()){
MessageBox("邮箱username不能为空","提示");
m_ctrUser.SetFocus();
return;
}
if(m_strUser.Find("@sina") < 1){
MessageBox("请先加入邮箱名的后缀,如@sina...","提示");
m_ctrUser.SetFocus();
return;
}
if(m_strPassword.IsEmpty()){
MessageBox("邮箱password不能为空","提示");
m_ctrUser.SetFocus();
return;
}
char szAccept[] = "Accept: */*";
char szReferer[] = "Referer: http://mail.sina.com.cn//r/n";
CString szFormData = "domain=sina.cn&logintype=uid&u="+ m_strUser +"&domain=sina.com&psw="+ m_strPassword +"&btnloginfr";
HINTERNET hSession;
HINTERNET hConnect;
HINTERNET hRequest;
BOOL bReturn = FALSE;
// 之前使用Socket,如今使用Wininet相关API建立链接
hSession = InternetOpen("InetAll",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
hConnect = InternetConnect(hSession,"mail.sina.com.cn",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);
hRequest = HttpOpenRequest(hConnect,"POST","cgi-bin/login.cgi",NULL,"http://www.sina.com.cn",(LPCSTR *)&szAccept,INTERNET_FLAG_RELOAD,1);
// 提交数据表单
LPVOID pBuf = (LPVOID)szFormData.GetBuffer(szFormData.GetLength());
bReturn = HttpSendRequest(hRequest,"Content-Type: application/x-www-form-urlencoded/r/n",-1,pBuf,szFormData.GetLength());
if(!bReturn)
{
MessageBox("发送Http请求失败!","提示",MB_ICONERROR | MB_OK);
return;
}
char szRecvBuf[1024]; // 接受数据缓冲区
DWORD dwNumberOfBytesRead; // server返回大小
DWORD dwRecvTotalSize=0; // 接受数据总大小
DWORD dwRecvBuffSize=0; // 接受数据buf的大小
CFile m_File; // 将返回数据写入文件
CString strTemp; // 暂时消息框
m_File.Open("RecvData.tmp",CFile::modeWrite | CFile::modeCreate,NULL);
memset(szRecvBuf,0,1024);
do
{
// 開始读取数据
bReturn = InternetReadFile(hRequest,szRecvBuf,1024,&dwNumberOfBytesRead);
if(!bReturn)
{
MessageBox("InternetReadFile Error !","提示",MB_ICONERROR | MB_OK);
break;
}
// 统计接受数据的大小
szRecvBuf[dwNumberOfBytesRead] = '/0';
dwRecvTotalSize += dwNumberOfBytesRead;
dwRecvBuffSize += strlen(szRecvBuf);
// 将缓冲区写入文件
m_File.Write(szRecvBuf,strlen(szRecvBuf));
m_File.Flush();
} while(dwNumberOfBytesRead !=0);
// 检查接受到的数据包是否完整
m_File.Close();
if(dwRecvTotalSize != dwRecvBuffSize)
{
MessageBox("接受数据时丢包,返回大小不一致!");
return ;
}
CString str=""; // 所有内容
CString strLine=""; // 单行内容
CStdioFile file; // 文件对象
if(!file.Open("RecvData.tmp",CFile::modeRead | CFile::typeText,NULL))
{
CString strTemp;
strTemp.Format("Open file error:%d",GetLastError());
MessageBox(strTemp);
return;
}
// 按行读取tmp所有内容
while(file.ReadString(strLine))
{
str = str + strLine;
}
file.Close();
wchar_t* pWChar = NULL;
DWORD nLen1;
// 将新浪网页UTF-8格式编码转换成Unicode
nLen1 = MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,0);
pWChar = new wchar_t[nLen1 + 1];
memset(pWChar,0,(nLen1 + 1 ) * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,nLen1);
char* pChar = NULL;
DWORD nLen2;
nLen2 = WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,0,NULL,NULL);
pChar = new char[nLen2 + 1];
memset(pChar,0, nLen2 + 1);
WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,nLen2,NULL,NULL);
// 查找登录时server时返回的信息
str.Format("%s",pChar);
if(str.Find("安全退出",0)>=1)
{
MessageBox("邮箱登录成功!","提示");
m_ctrUser.SetFocus();
}
else
{
MessageBox("邮箱登录失败!","提示",MB_ICONERROR | MB_OK);
m_ctrUser.SetFocus();
}
// 删除暂时文件、释放内存
DeleteFile("RecvData.tmp");
delete pChar;
delete pWChar;
}
5、源代码下载地址
VC POST表单——登录验证新浪邮箱的更多相关文章
- js表单简单验证(手机号邮箱)
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncod ...
- AngularJS学习之 登录表单 清爽验证(边学边更新)
注册过程的确好多需要验证的,但是注册成功之后的登录就简单多了, 只要用户 输入 用户名和密码, ajax向后台提交登录请求, 根据返回的结果确定用户名或者密码是否正确即可登录. 所以这个登录表单的验证 ...
- WEB安全讨论-表单登录是先验证验证码还是密码
表单登录是先验证验证码还是密码? 肯定是验证码呀!!!这是毋庸置疑的.但是发现有人会验证密码,感觉先验证密码和先验证验证码是一个概念是一样的.但是其实是完全不一样的.下面我们来一起详细的剖析一下: 消 ...
- aspx中的表单验证 jquery.validate.js 的使用 以及 jquery.validate相关扩展验证(Jquery表单提交验证插件)
这一期我们先讲在aspx中使用 jquery.validate插件进行表单的验证, 关于MVC中使用 validate我们在下一期中再讲 上面是效果,下面来说使用步骤 jQuery.Valid ...
- EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
带参提交一次查询,从服务器加载新数据.这是一个神奇的方法 $('#dg').datagrid('load',{ code: '01', name: 'name01' }); easyui修改操作的回显 ...
- easyui表单多重验证,动态设置easyui控件
要实现的功能:在做添加学生信息的时候,利用easyui的验证功能判断 学号是否重复和学号只能为数字 最终效果如下图: 但在做这个的过程中,遇到了一系列的问题: 扩展validatebox的验证方法,最 ...
- 10款精美的HTML5表单登录联系和搜索表单
1.HTML5/CSS3仿Facebook登录表单 这款纯CSS3发光登录表单更是绚丽多彩.今天我们要分享一款仿Facebook的登录表单,无论从外观还是功能上说,这款登录表单还是挺接近Faceboo ...
- HTML5表单及其验证
随笔- 15 文章- 1 评论- 115 HTML5表单及其验证 HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用.HTML5 Forms新增了许多新控件及其A ...
- Spring Security 表单登录
1. 简介 本文将重点介绍使用Spring Security登录. 本文将构建在之前简单的Spring MVC示例之上,因为这是设置Web应用程序和登录机制的必不可少的. 2. Maven 依赖 要将 ...
随机推荐
- Kiwi Syslog server 日志服务器搭建
Kiwi syslog server 是一款很不错的日志服务器软件,安装过程就不多说,Linux 服务器日志由于本身就是syslog的,所以不用转换,但是windows 系统的日志格式是event形式 ...
- Django Form Media 阅读笔记
---恢复内容开始--- Form Media Rendering an attractive and easy-to-use Web form requires more than just HTM ...
- Knockout应用开发指南 第二章:监控属性(Observables)
原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...
- Go by Example
Go by Example Go is an open source programming language designed for building simple, fast, and reli ...
- 《深入理解mybatis原理》 Mybatis初始化机制具体解释
对于不论什么框架而言.在使用前都要进行一系列的初始化,MyBatis也不例外. 本章将通过下面几点具体介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XM ...
- android中listview分页载入数据
前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...
- PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决
环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...
- hdu4635(最多加多少边,使得有向图不是强连通图)
连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...
- uvalive4015 (树上背包)
给一棵树,边上有权值,然后给一个权值x,问从根结点出发, 走不超过x的距离,最多能经过多少个结点. 走过的点可以重复走,所以可以从一个分支走下去,然后走回来,然后再走另一个分支 dp[u][j][0] ...
- WPF换肤之一:创建圆角窗体
原文:WPF换肤之一:创建圆角窗体 我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感.这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文 ...