C#利用WebBrowser获取完整COOKIE介绍

C#利用WebBrowser获取完整COOKIE介绍


  • 摘要:使用WebBrowser控件获取网站的COOKIE有时候是不完整的,本文介绍WebBrowser控件获取网站的COOKIE不完整的原因,并提供一个利用WebBrowser获取完整COOKIE的示例供参考。

在WebBrowser下对网页进行操作其实是一件挺轻松的事情,他可以很方便实现自定义的网站访问习惯。而WebBrowser毕竟 是对MS原生控件的封装,当我们使用C#下的WebBrowser尤其是这样,虽然他可以更方便大家去调用,但是他的方便却是牺牲了灵活性为代价的。

有一天我想使用WebBrowser获取一个网站的COOKIE,在调用Document.Cookie时,发现无法完整获取其COOKIE,百思 不得其解,这么简单的功能,WebBrowser也会秀逗。经过抓包分析,发现原来该网站对写入到用户端关键的Cookie,加入httponly

HttpOnly,其实是一个提高WEB网站应用程序安全性的一个功能,但是大家往往都把他给忽略掉了。比如在ASP.NET 2.0的web.config的配制文件里就提供这个子的设置

 
  
1 < httpCookies httpOnlyCookies = " true " />
2 // ***********.NET的代码如:
3 HttpCookie myCookie = new HttpCookie( " myCookie " );
4 myCookie.HttpOnly = true ;
5 Response.AppendCookie(myCookie);
就是这个小小的设置,令WebBrowser拿他却是没辙,查了大量资料,要想实现这个功能,一定需要实现对最原始的网络流的读写,这种方法对很多程序员来说实现难度太大了。下面就教大家实现一个很简单的实现方法
 
  
1 public string Cookie()
2 {
3 if ( this .Url == null )
4 return null ;
5 string dir = this .Url.Host;
6 FileStream fr = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + " \\index.dat " , FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
7 byte [] __dat = new byte [( int )fr.Length];
8 fr.Read(__dat, 0 , __dat.Length);
9 fr.Close();
10 fr.Dispose();
11 string __datstream = Encoding.Default.GetString(__dat);
12 int p1 = 0 ;
13 p1 = __datstream.IndexOf( " @ " + dir, p1);
14 if (p1 == - 1 )
15 p1 = __datstream.IndexOf( " @ " + dir.Substring(dir.IndexOf( ' . ' ) + 1 ));
16 if (p1 == - 1 )
17 return this .Document.Cookie;
18 int p2 = __datstream.IndexOf( " .txt " , p1 + 1 );
19 p1 = __datstream.LastIndexOf( ' @ ' , p2);
20 string dm = __datstream.Substring(p1 + 1 , p2 - p1 + 3 ).TrimStart( ' ? ' );
21 p1 = __datstream.LastIndexOf( " : " , p1);
22 p2 = __datstream.IndexOf( ' @ ' , ++ p1);
23 __datstream = string .Format( " {0}@{1} " , __datstream.Substring(p1, p2 - p1), dm);
24
25 Dictionary < string , string > __cookiedicts = new Dictionary < string , string > ();
26 string __n;
27 StringBuilder __cookies = new StringBuilder();
28 __datstream = File.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + " \\ " + __datstream, Encoding.Default);
29 p1 = - 2 ;
30 do
31 {
32 p1 += 2 ;
33 p2 = __datstream.IndexOf( ' \n ' , p1);
34 if (p2 == - 1 )
35 break ;
36 __n = __datstream.Substring(p1, p2 - p1);
37 p1 = p2 + 1 ;
38 p2 = __datstream.IndexOf( ' \n ' , p1);
39 if ( ! __cookiedicts.ContainsKey(__n))
40 __cookiedicts.Add(__n, __datstream.Substring(p1, p2 - p1));
41 }
42 while ((p1 = __datstream.IndexOf( " *\n " , p1)) > - 1 );
43 if ( this .Document.Cookie != null && this .Document.Cookie.Length > 0 )
44 {
45 foreach ( string s in this .Document.Cookie.Split( ' ; ' ))
46 {
47 p1 = s.IndexOf( ' = ' );
48 if (p1 == - 1 )
49 continue ;
50 __datstream = s.Substring( 0 , p1).TrimStart();
51 if (__cookiedicts.ContainsKey(__datstream))
52 __cookiedicts[__datstream] = s.Substring(p1 + 1 );
53 else
54 __cookiedicts.Add(__datstream, s.Substring(p1 + 1 ));
55 }
56 }
57 foreach ( string s in __cookiedicts.Keys)
58 {
59 if (__cookies.Length > 0 )
60 __cookies.Append( ' ; ' );
61 __cookies.Append(s);
62 __cookies.Append( ' = ' );
63 __cookies.Append(__cookiedicts[s]);
64 }
65 return __cookies.ToString();
66 }

转载于:https://www.cnblogs.com/ccczqh/archive/2012/07/23/2605628.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值