惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
G
Google Developers Blog
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
小众软件
小众软件
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
P
Proofpoint News Feed
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
The Cloudflare Blog
博客园_首页
美团技术团队
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - Lthis

Linux 用户特殊目录:中文改英文 完整指南(比如“桌面”->“Desktop”) 解决LKM编译报错:include/linux/compiler_types.h:258:20: warning: ‘asm’ operand 2 probably does not match constraints ubuntu 14.04 LTS root用户登录 IDA远程调试出现"The file can't be loaded by the debugger plugin."云云 【转】(总结)CentOS Linux下VNC Server远程桌面配置详解 【转】记使用Kali linux 2.0的一些坑 【转】目前常见的加密壳列表 winhex中文显示乱码问题 【收集】在OD中跑会出错,单独运行没问题 linux 端口 【转】第二课.汇编语言-8086指令、典型函数调用约定 【转】第一课寄存器与寻址 【转】snort 【转】snort.conf分析(中文) 【转】snort 笔记2 ----- 规则编写 【转】Snort语法规则说明及实例讲解 【转】Snort 命令参数详解 Edit控件设置多行显示的方法 POST教程笔记 - POST方式登录网站
POST教程笔记 - Cookie方式登录网站
Lthis · 2015-11-04 · via 博客园 - Lthis

www.cctry.com post教程

注意,本文章并非教程

获取Cookie

#import "C:\\Windows\\SysWow64\\winhttp.dll" no_namespace
#define Get_WinHttp_RspString(IWinHttpRequestPtr_Obj, CString_Obj){                \
    _variant_t varRspBody = IWinHttpRequestPtr_Obj->GetResponseBody();            \
    ULONG dataLen = varRspBody.parray->rgsabound[0].cElements;                    \
    char *pContentBuffer = (char *)varRspBody.parray->pvData;                    \
    CString_Obj = pContentBuffer;}

void getWinHttpRspString(IWinHttpRequestPtr &pHttpReq, CString& strBuffer)
{
    _variant_t varRspBody = pHttpReq->GetResponseBody();
    ULONG dataLen = varRspBody.parray->rgsabound[0].cElements;                    
    char *pContentBuffer = (char *)varRspBody.parray->pvData;                    
    strBuffer = pContentBuffer;
}




void Cidc816LoginDlg::OnBnClickedButton1()
{
    CString strName, strPwd;
//     GetDlgItemText(IDC_EDIT1, strName);
//     GetDlgItemText(IDC_EDIT2, strPwd);
//     if (strPwd == L"" || strName == L"")
//     {
//         MessageBox(L"用户名密码不能空");
//         return;
//     }
//
//     strName = L"XXX";
//     strPwd  = L"XXX";


    IWinHttpRequestPtr pHttpReq = NULL;
    HRESULT hr = pHttpReq.CreateInstance(__uuidof(WinHttpRequest));
    if (FAILED(hr))
        return;

    // 这里要注意需要POST的网址
    hr = pHttpReq->Open(L"POST", L"http://www.idc816.com/chklogin.asp");
    if (FAILED(hr))
        return;

     pHttpReq->SetRequestHeader(L"Content-Type", L"application/x-www-form-urlencoded");

     // 这里是重点,为了获取Cookie,关闭掉WinHttp的重定向功能
     // COleVariant varFalse = VARIANT_FALSE;
     // hr = pHttpReq->put_Option(WinHttpRequestOption_EnableRedirects, varFalse);
     pHttpReq->Option[WinHttpRequestOption_EnableRedirects] = VARIANT_FALSE;


    variant_t varBody = NULL;
    // 这里也需要注意,字段不要写错了
    varBody = L"u_name=XXX&u_password=XXX&imageField.x=28&imageField.y=11";
    hr = pHttpReq->Send(varBody);
    if (FAILED(hr))
        return;

    CString strCntBuffer;
    getWinHttpRspString(pHttpReq, strCntBuffer);


    long status = pHttpReq->GetStatus();
    
    CString strSucKey(_T("/Manager/"));
    if (status == 302 && strCntBuffer.Find(strSucKey) != -1)
    {
        _bstr_t bstrAllHeader = \
            pHttpReq->GetAllResponseHeaders();    // 需要获取所有Cookie,所以不能使用GetResponseHeader
        CString strCookie = getCookieString(CString((LPCTSTR)bstrAllHeader));
        SetDlgItemText(IDC_EDIT3, strCookie);
        MessageBox(_T("登陆成功!"));
    }
    else {
        MessageBox(_T("登陆失败!"));
    }
    
}

以上code中的getCookieString如下:

/*

Cache-Control: private
Content-Length: 107
Content-Type: text/html
Location: /Manager/
Server: Microsoft-IIS/8.0
Set-Cookie: user%5Fpwd=1329c273dda5a8c3; path=/
Set-Cookie: user%5Fname=winuser; path=/
Set-Cookie: safecode=8de86d96685c1249; path=/
X-Powered-By: ASP.NET
Date: Wed, 04 Nov 2015 12:15:46 GMT
*/

CString Cidc816LoginDlg::getCookieString(CString strResponseHeader)
{
    CString strCookie;

    int nPos = strResponseHeader.Find(L"Set-Cookie:");
    if (-1 == nPos) return NULL;
    int nCount = strResponseHeader.GetLength() - nPos;
    strResponseHeader = strResponseHeader.Right(nCount);

    nPos = strResponseHeader.Find(L"X-Powered-By:");
    if (-1 == nPos) return NULL;
    strCookie = strResponseHeader.Left(nPos);
    

    return strCookie;
}

对比VC驿站SYC老大的代码

CString GetCookieString(CString& strRspHeader)
{
    CString retCookie, strKey = _T("Set-Cookie: ");
    int iBegin = 0, iEnd = 0;
    while(iBegin < strRspHeader.GetLength())
    {
        iBegin = strRspHeader.Find(strKey, iBegin);
        if (iBegin >= 0)
        {
            iEnd = strRspHeader.Find(_T("\r\n"), iBegin);
            if (iEnd > 0)
            {
                retCookie += strRspHeader.Mid(iBegin, iEnd-iBegin+2);
                iBegin = iEnd;
            }
        }else{
            break;
        }
    }

    return retCookie;
}

 获取的Cookie

Set-Cookie: safecode=840b0ce1c0fc85c1; path=/
Set-Cookie: user%5Fpwd=9ca701ff68e6bac3; path=/
Set-Cookie: user%5Fname=winuser; path=/
Set-Cookie: ASPSESSIONIDAATATQQC=FADLFEABIKELJDBJHFPEBIOP; path=/

获取Cookie完成后,可以尝试不登陆进行用户信息的获取,代码如下:

void Cidc816LoginDlg::OnBnClickedButton2()
{
    IWinHttpRequestPtr pHttpReq;
    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;

    CString strCookie;
    GetDlgItemText(IDC_EDIT4, strCookie);
    if (strCookie.GetLength() > 0)
    {   // 设置Cookie是本课重点 AllocSysString转换为bstr_t格式
        pHttpReq->SetRequestHeader(_T("Cookie"), strCookie.AllocSysString());
    }

    hr = pHttpReq->Send();
    if (FAILED(hr)) return;

    CString strCntBuffer;
    Get_WinHttp_RspString(pHttpReq, strCntBuffer);

    CString strTel = GetMidStrByLAndR(strCntBuffer, _T("u_telphone  value=\""), _T("\""));
    SetDlgItemText(IDC_EDIT5, strTel);

    CString strCity = GetMidStrByLAndR(strCntBuffer, _T("u_city value=\""), _T("\""));
    SetDlgItemText(IDC_EDIT6, strCity);

    CString strContrack = GetMidStrByLAndR(strCntBuffer, _T("u_contract  value=\""), _T("\""));
    SetDlgItemText(IDC_EDIT7, strContrack);

    if (strTel.IsEmpty() || strCity.IsEmpty() || strContrack.IsEmpty())
    {
        MessageBox(_T("获取用户信息失败!"));
    }
}

最后效果