首页
社区
课程
招聘
[原创]网络用户登录密码验证过程
发表于: 2007-8-13 19:01 10901

[原创]网络用户登录密码验证过程

2007-8-13 19:01
10901
通常网络密码验证过程是这样的:客户端在获取用户输入的用户名和密码信息之后创建socket套接字与远程服务器建立一个连接,发送用户名和密码并等待服务器返回消息,服务器收到用户名和密码之后查询服务器数据库,如果用户名密码正确返回给客户端一个登录成功消息,否则返回一个密码错误的消息!

下面是用VC++实现验证过程中的部分代码,代码有点乱:
//获取用户输入信息
void CClientDlg::OnOK()
{
//之前socket已经经过初始化
UpdateData();
if(m_username.IsEmpty()||m_userID.IsEmpty())
  MessageBox("请输入所有信息!","用户登录",MB_OK);
else
{
  if(Load()) //调用验证函数
  {
//   close(destSocket);
   closesocket(destSocket);
   CDialog::OnOK();
   MessageBox("登陆成功!","用户登录",MB_OK);//验证成功
   CChat chat;
   chat.m_username=m_username;
//   chat.res=res;
   chat.DoModal();
  }
  else
  {      //验证失败
   MessageBox("尚未注册或\n用户名/密码有误。","用户登录",MB_OK);
  }
}
}
BOOL CClientDlg::Load() //发送"Load:"
{
////////////////////////发送登陆信息并接收反馈信息/////////////////////////////
char sendText[100],recvText[5025];
int numsnt,numrcv,status;
sprintf(sendText,"Load:%s,%s",m_username,m_userID);
numsnt=send(destSocket, sendText, strlen(sendText) + 1, NO_FLAGS_SET);
if (numsnt != (int)strlen(sendText) + 1)
    {
  MessageBox("ERROR: Connection terminated!","用户登录",MB_OK);
  status=closesocket(destSocket);
  if (status == SOCKET_ERROR)
   MessageBox("ERROR: closesocket unsuccessful!","用户登录",MB_OK);
     status=WSACleanup();
  if (status == SOCKET_ERROR)
   MessageBox("ERROR: WSACleanup unsuccessful!","用户登录",MB_OK);
  return false;
    }
numrcv=recv(destSocket, recvText, 5025, NO_FLAGS_SET);
if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
    {
      MessageBox("ERROR: Connection terminated!","用户登录",MB_OK);
      status=closesocket(destSocket);
      if (status == SOCKET_ERROR)
    MessageBox("ERROR: closesocket unsuccessful!","用户登录",MB_OK);
      status=WSACleanup();
      if (status == SOCKET_ERROR)
    MessageBox("ERROR: WSACleanup unsuccessful!","用户登录",MB_OK);
      return false;
    }
recvText[numrcv]='\0';
//////////////////////////////////////////////////////////////////////////////
/////////////////////读取返回标志和用户信息///////////////////////////////////
char Flag[10];
char *pos=strchr(recvText,'!');
pos+=1;
int len_text=strlen(recvText);
int len_pos=strlen(pos);
int len=len_text-len_pos;
for(int i=0;i<len;i++)
  Flag[i]=recvText[i];
Flag[len]='\0';
if(strcmp(Flag,"success!")!=0)
  return false;
///////////////////////////////////////////////////////////////////////////////
///////////////////////将用户信息写入与用户名对应的文件////////////////////////
else
{
  CString filename;
  filename.Format(".\\data\\%s.db",m_username);
  FILE *file;
  if((file=fopen(filename,"w"))!=NULL)
  {
   fprintf(file,"%s",pos);
  }
  fclose(file);
}
///////////////////////////////////////////////////////////////////////////////
return true;
}
//附网络初始化代码
BOOL CClientDlg::Init_net()
{
/////////////////////////网络初始化///////////////////////////////////
status=WSAStartup(MAKEWORD(1, 1), &Data);
if (status != 0)
  MessageBox("ERROR: WSAStartup unsuccessful!","用户登录",MB_OK);
destAddr=inet_addr(DEST_IP_ADDR);  //暂时定为本机使用
memcpy(&destSockAddr.sin_addr, &destAddr,sizeof(destAddr));
destSockAddr.sin_port=htons(606);
destSockAddr.sin_family=AF_INET;
destSocket=socket(AF_INET, SOCK_STREAM, 0);
if (destSocket == INVALID_SOCKET)
{
  MessageBox("ERROR: socket unsuccessful!","用户登录",MB_OK);
  status=WSACleanup();
  if (status == SOCKET_ERROR)
   MessageBox("ERROR: WSACleanup unsuccessful!","用户登录",MB_OK);
  return false;
}
//////////////////////////////////////////////////////////////////////
///////////////////////////连接网络////////////////////////////////////////////
status=connect(destSocket, (LPSOCKADDR) &destSockAddr,sizeof(destSockAddr));
if (status == SOCKET_ERROR)
{
  MessageBox("ERROR: connect unsuccessful!","用户登录",MB_OK);
  status=closesocket(destSocket);
  if (status == SOCKET_ERROR)
   MessageBox("ERROR: closesocket unsuccessful!","用户登录",MB_OK);
  status=WSACleanup();
  if (status == SOCKET_ERROR)
   MessageBox("ERROR: WSACleanup unsuccessful!","用户登录",MB_OK);
  return false;
}
///////////////////////////////////////////////////////////////////////////////
return true;
}

//////////////////////////////////服务端代码/////////////////////////////////
//建立一个基于消息的异步套接字
BOOL CSkyQQsrvDlg::InitSocket()
{
m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0); //WSASocket创建套接字
if(INVALID_SOCKET==m_socket)
{
  MessageBox("创建套接字失败!");
  return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(606);//设置606为监听端口
if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
  MessageBox("绑定失败!");
  return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))//请求一个基于消息的网络事件通知异步套接字
{
  MessageBox("注册网络读取事件失败!");
  return FALSE;
}
return TRUE;
}
//建立消息映射,在SkyQQsrvDlg.h中添加
#define UM_SOCK  WM_USER+1 //定义消息
//消息映射
BEGIN_MESSAGE_MAP(CSkyQQsrvDlg, CDialog)
//{{AFX_MSG_MAP(CSkyQQsrvDlg)
// ON_WM_SYSCOMMAND()
// ON_WM_PAINT()
// ON_WM_QUERYDRAGICON()
ON_MESSAGE(UM_SOCK,OnSock)
// ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL bchar=FALSE;//密码检测结果
SOCKET m_socket;
void CSkyQQsrvDlg::OnSock(WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:  //读取事件
  WSABUF wsabuf;
  wsabuf.buf=new char[200];
  wsabuf.len=200;
  DWORD dwRead;
  DWORD dwFlag=0;
  SOCKADDR_IN addrFrom;
  int len=sizeof(SOCKADDR);
  CString str;
  CString strTemp;
  HOSTENT *pHost;
  if(SOCKET_ERROR==WSARecvFrom   (m_socket,&wsabuf,1,&dwRead,&dwFlag,//WSARecvFrom接受数据函数
      (SOCKADDR*)&addrFrom,&len,NULL,NULL))
  {
   MessageBox("接收数据失败!");
   return;
  }
  pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);
  addrFromIP.sin_addr.S_un.S_addr=addrFrom.sin_addr.S_un.S_addr;
  char(wsabuf.buf);//调用密码检测函数
CString strSend;
if(bchar)
{//发送验证成功的消息
  strsend="success";
}
else    strsend="FALSE";
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_addr.S_un.S_addr=addrFromIP.sin_addr.S_un.S_addr;
addrTo.sin_port=Port;//将获取的数据端口设置为发送数据端口
len=strSend.GetLength();    //长度
wsabuf.buf=strSend.GetBuffer(len);
wsabuf.len=len+1;
if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0, //WSASend发送数据
   (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
  MessageBox("发送数据失败!");
  return;
}
}
}
void char(char * wsabuf)
{
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset
CString admin,passwd;
huanyuan(wsabuf,admin,passwd);
//假设服务器上已经有一个ACCESS数据库文件,文件名为skywd,并建有user(admin,password)表
//初始话OLE/COM库环境
::CoInitialize(NULL);
try
{
_ConnectionPtr pConn(__uuidof(Connection));
pConn->C;
pConn->Open("","","",adConnectUnspecified); //打开对数据库的连接,用户ID和密码,同步打开这个连接
m_pC;
}
//捕捉异常
catch(_com_error e)
{   //显示错误信息
//  AfxMessageBox(e.Description());
  AfxMessageBox("数据库连接出错");
}
//设置INSERT语句,查询数据
_bstr_t vSQL;
vSQL = "SELECT * FROM user WHERE admin = '" +admin + "'" ; //变量直接加,字符串用""括起来
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(vSQL,m_pConnection.GetInterfacePtr(), //直接用记录集对象查询
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
  AfxMessageBox(e.Description());
}
_variant_t  var = m_pRecordset->GetCollect("password");
  if(var.vt!=VT_NULL)
  {
   if(passwd==(LPCTSTR)_bstr_t(var))
   bchar=TRUE;//通过验证
  }
  else
  { //如果答案为空,则重建答案
   bchar=FALSE;
  }
//断开数据库连接
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
}

zhuanhuan(char * wsabuf,CString admin,CString passwd)
{
    CString str1=wsabuf;
    int n1=str1.Find(":");
    int n2=str1.Find(",");
    int n3=str1.Getlength()-1;
    admin=str1.Left(n2);
    admin=admin.Right(n2-n1-1);
    passwd=str1.Right(n3-n2-1);
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
东西是相当好,可是这里是汇编版块呀。VC++我一点也不懂咋办。
小菜我想要汇编的资料来学习下~~~~~~
2007-8-14 00:56
0
雪    币: 120
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不会吧,这是汇编板块?
2007-8-14 18:13
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
没有只懂汇编的程序员.........如果你只懂汇编,只能说明你的功力还不够。。
2007-8-14 20:19
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
什么改版的,我怎么不知道。打你PP
2007-8-14 21:02
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
救星   巧啊   我急死   有delphi2007的?
2007-8-14 21:46
0
雪    币: 120
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
大家是否有截获并分析网络封包的源代码啊,比如客户端发送用户名密码信息的时候将消息截获并分析出里面的用户名密码,如果是加密的还能进行解密!
2007-8-15 10:29
0
雪    币: 243
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
简单的网络通信程序而已,我觉得更简单和有效的验证可以和web程序进行验证,这样就没必要自备服务器了
2007-8-17 19:03
0
雪    币: 120
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
是啊,ASP等WEB语言与数据库交换数据肯定不比VC差,尤其是在网络程序里面.
2007-8-18 13:53
0
游客
登录 | 注册 方可回帖
返回
//