C#下利用WebBrowser完整获取COOKIE
在WebBrowser下对网页进行操作其实是一件挺轻松的事情,他可以很方便实现自定义的网站访问习惯。而WebBrowser毕竟是对MS原生控件的封装,当我们使用C#下的WebBrowser尤其是这样,虽然他可以更方便大家去掉用,但是他的方便却是牺牲了灵活性为代价的。
有一天我想使用WebBrowser获取一个网站的COOKIE,在调用Document.Cookie时,发现无法完整获取其COOKIE,百思不得其解,这么简单的功能,WebBrowser也会秀逗。经过抓包分析,发现原来该网站对写入到用户端关键的Cookie,加入httponly
HttpOnly,其实是一个提高WEB网站应用程序安全性的一个功能,但是大家往往都把他给忽略掉了。比如在ASP.NET 2.0的web.config的配制文件里就提供这个子的设置
就是这个小小的设置,令WebBrowser拿他却是没辙,查了大量资料,要想实现这个功能,一定需要实现对最原始的网络流的读写,这种方法对很多程序员来说实现难度太大了。下面就教大家实现一个很简单的实现方法
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref System.UInt32 pcchCookieData, int dwFlags, IntPtr lpReserved);
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetSetCookieEx(string lpszURL, string lpszCookieName, string lpszCookieData, int dwFlags, IntPtr lpReserved);
private static string GetCookieString(string url)
{
uint num = 256;
StringBuilder stringBuilder = new StringBuilder((int)num);
string result;
if (!InternetGetCookieEx(url, null, stringBuilder, ref num, 0x2000, IntPtr.Zero))
{
if (num < 0)
{
result = null;
return result;
}
stringBuilder = new StringBuilder((int)num);
if (!InternetGetCookieEx(url, null, stringBuilder, ref num, 0x2000, IntPtr.Zero))
{
result = null;
return result;
}
}
result = stringBuilder.ToString();
return result;
}
private static bool SetCookieString(string url, string cookie)
{
try
{
bool flag = InternetSetCookieEx(url, null, cookie, 0x2000, IntPtr.Zero);
return flag;
}
catch (Exception)
{
return false;
}
}