请问下,正常情况下是不是post账号密码给目标网页,之后再同一个浏览器中刷新就是登陆状态

jyxuan94 2016-05-13 10:43:08
不知道是我抓包错了,还是我理解的问题,做一个网页的插件,用的是firebreath开发的,把账号密码的post上去,执行插件,刷新页面后没有登陆,这是post的代码
	std::string post(LPCWSTR website,LPCWSTR page,string data,LPCWSTR spare=NULL)									//post函数
{
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer = NULL;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
BOOL bResults = FALSE;
hSession=WinHttpOpen(L"User-Agent",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,WINHTTP_NO_PROXY_BYPASS,0);
if(hSession)
{
hConnect=WinHttpConnect(hSession,website,INTERNET_DEFAULT_HTTP_PORT,0);
}
if(hConnect)
{
hRequest=WinHttpOpenRequest(hConnect, L"POST",page,L"HTTP/1.1", WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
}
LPCWSTR header=L"Content-type: application/x-www-form-urlencoded\r\n";
SIZE_T len = lstrlenW(header);
WinHttpAddRequestHeaders(hRequest,header,DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);
if(hRequest)
{
//string data="a=2";
const void *ss=(const char *)data.c_str();
bResults=WinHttpSendRequest(hRequest, NULL,NULL,const_cast<void *>(ss),data.length(), data.length(), 0 );
// bResults=WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );
}
if(bResults)
{
bResults=WinHttpReceiveResponse(hRequest,NULL);
}
if (!bResults)
{
cout << "Error " << GetLastError() << " has occurred." << endl;
}
if(bResults)
{
do
{
// Check for available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
{
printf( "Error %u in WinHttpQueryDataAvailable.\n",GetLastError());
break;
}
if (!dwSize)
break;
pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
printf("Out of memory\n");
break;
}
ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded))
{
printf( "Error %u in WinHttpReadData.\n", GetLastError());
}
else
{
printf("%s", pszOutBuffer);
printf("\n");
}
// delete [] pszOutBuffer;
if (!dwDownloaded)
break;
} while (dwSize > 0);
}
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
return pszOutBuffer;
}

post模拟登陆后浏览器不会自己带着这个网页的cookie访问吗?
...全文
247 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyxuan94 2016-05-18
  • 打赏
  • 举报
回复
引用 12 楼 CharlesSimonyi 的回复:
你可以尝试一下做淘宝、京东的POST登录,看看他们POST的内容有什么区别,除了账号密码还有什么东西
好的。。谢谢大大
encoderlee 2016-05-18
  • 打赏
  • 举报
回复
你可以尝试一下做淘宝、京东的POST登录,看看他们POST的内容有什么区别,除了账号密码还有什么东西
encoderlee 2016-05-18
  • 打赏
  • 举报
回复
要针对不同的网站来分析,能否成功主要是和POST的内容有关,当然少数网站也对请求头有严格的检查。有的网站POST的时候除了用户名密码,还有一大堆乱七八糟的字符串,这些字符串是通过随机值使用各种算法计算出来的,有的网站POST的密码都是加密过的,而各个网站加密算法也不相同,所以很难写一套代码就适用于所有的网站
jyxuan94 2016-05-18
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
那样需要为不用的网站写不同的实现代码,因为大多数情况下不同的网站登录的时候POST的内容都不相同
例如http请求头,需要根据不同的网站重新去抓取填写,还是像上面代码那样就可以了,我看到有些post的代码会把抓包的请求头一点不差的写一遍,有些post就像我帖子最先贴的代码那样只是用到了其中一部分,跟http请求头有关吗
jyxuan94 2016-05-18
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
那样需要为不用的网站写不同的实现代码,因为大多数情况下不同的网站登录的时候POST的内容都不相同
大大,登陆除了要账号密码,还有一些网页中input的隐藏值,除了这些post还要什么内容
encoderlee 2016-05-17
  • 打赏
  • 举报
回复
那样需要为不用的网站写不同的实现代码,因为大多数情况下不同的网站登录的时候POST的内容都不相同
jyxuan94 2016-05-17
  • 打赏
  • 举报
回复
引用 6 楼 CharlesSimonyi 的回复:
Chrome或Firefox底层没有使用Wininet,所以它不会自动把Cookie共享给浏览器。 当然自行实现也是可以的,比如编写Chrome或Firefox的浏览器插件,当WinHttp进行POST请求成功后把获取到的Cookie通过Chrome或Firefox提供的API设置进去。 在IE上也可以用winhttp实现,同样,编写IE插件,进行POST请求成功后需要把Cookie提取出来,然后用InternetSetCookie、InternetSetCookieEx给IE浏览器设置Cookie。
大大最后问个问题,如果别人调用我这个插件,只给我网页地址,让我从中网页中抓到源码,取到input的name和value,然后传给我post的网页地址和账号密码的内容,将账号密码和input的内容一起post过去,能适用于多个网站的自动登陆吗,例如这样
plugin().autologin("http://passport.tianya.cn/login","http://passport.tianya.cn/login","vwriter=test_user2010","vpassword=t123456","","","","","");
jyxuan94 2016-05-16
  • 打赏
  • 举报
回复
引用 4 楼 CharlesSimonyi 的回复:
要保证以下条件才能达成你的目的: 1.你说的浏览器是IE,而不是Chrome或Firefox 2.你的这段代码要在IE进程内运行,如果你写的是IE插件或是网页上的Activex控件,都能满足这个要求。 3.POST应该是成功的 4.关键,换用Wininet实现,而不是WinHTTP,因为WinHTTP是会话隔离的。而Wininet并非会话隔离,由于IE内部也是通过Wininet来访问WEB服务器,如果使用Wininet进行POST登录,获取到的Cookie是会自动共享给同进程中的IE的。
谢谢大大,有几个问题想问下,1.Chrome或Firefox浏览器实现不了吗? 2.可以使用winhttp实现,然后成功post接收cookie值然后给网页吗?
encoderlee 2016-05-16
  • 打赏
  • 举报
回复
Chrome或Firefox底层没有使用Wininet,所以它不会自动把Cookie共享给浏览器。 当然自行实现也是可以的,比如编写Chrome或Firefox的浏览器插件,当WinHttp进行POST请求成功后把获取到的Cookie通过Chrome或Firefox提供的API设置进去。 在IE上也可以用winhttp实现,同样,编写IE插件,进行POST请求成功后需要把Cookie提取出来,然后用InternetSetCookie、InternetSetCookieEx给IE浏览器设置Cookie。
encoderlee 2016-05-14
  • 打赏
  • 举报
回复
要保证以下条件才能达成你的目的: 1.你说的浏览器是IE,而不是Chrome或Firefox 2.你的这段代码要在IE进程内运行,如果你写的是IE插件或是网页上的Activex控件,都能满足这个要求。 3.POST应该是成功的 4.关键,换用Wininet实现,而不是WinHTTP,因为WinHTTP是会话隔离的。而Wininet并非会话隔离,由于IE内部也是通过Wininet来访问WEB服务器,如果使用Wininet进行POST登录,获取到的Cookie是会自动共享给同进程中的IE的。
jyxuan94 2016-05-13
  • 打赏
  • 举报
回复
还有就是我post之后返回值是页面的源码,是因为代码问题吗
Eleven 2016-05-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/visualeleven/article/details/6656224 希望对你有所帮助~
Yofoo 2016-05-13
  • 打赏
  • 举报
回复
WinHttpOpen 这些API使用的cookie 系统是不可能传给浏览器的, 需要你获取服务器返回的cookie 再设置给浏览器

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧