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 依赖 要将 ...
随机推荐
- 30岁生日,媳妇赏的,U-BOAT手表一枚-数字尾巴
http://bbs.dgtle.com/thread-139611-1-1.html
- MySQL创建用户权限结果Trigger失败
说来惭愧,MySQL我已经在只将用于,非常赞赏阶段. 甚至一些比较深层次的管理,不熟悉如何,我们要加强啊! 最近.系统测试,使用MySQL数据库,你需要在表上创建触发器.该数据库是安装在机.但.在任何 ...
- C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段
C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...
- intellij idea该插件开发摘要
最近在做一个intellij idea插件,功能是读取表和数据库信息字段和预先定义的模板来生成代码文件(实体,service,springmvc该controller,freemark文件等). 找了 ...
- 设计模式初探3——装饰者模式(Decorator Pattern)
装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 适用范围: 1. 须要扩展一个类的功能.或给一个类加入附加职责. 2. 须要动态的给一个对象加入功能,这些功 ...
- uvalive4015 (树上背包)
给一棵树,边上有权值,然后给一个权值x,问从根结点出发, 走不超过x的距离,最多能经过多少个结点. 走过的点可以重复走,所以可以从一个分支走下去,然后走回来,然后再走另一个分支 dp[u][j][0] ...
- mysql替换字段里数据内容部分字符串(亦可用于增加字段中的内容)
mysql替换表的字段里面内容,如例子: mysql> select host,user from user where user='testuser'; +----------------- ...
- RTF 格式 说明
摘要: 本文对RTF文件格式进行分析研究,对RTF文件结构及特性进行了阐述,并分别列举了几个有用性的样例进行具体分析, 终于通过VB程序代码实现了一个RTF书写器(不具有所见即所得特性).本文对软件开 ...
- Java使用LdAP获取AD域用户
随着我们的习大大上台后,国家在网络信息安全方面就有了非常明显的改变!所以如今好多做网络信息安全产品的公司和须要网络信息安全的公司都会提到用AD域server来验证,这里就简单的研究了一下! 先简单的讲 ...
- [背景分离] 识别移动物体基于高斯混合 MOG
使用很easy, frame 就是当前帧, foreground 是取得的, binary 型背景, 0.03是学习速率能够依据实际调整. cv::BackgroundSubtractorMOG ...