C#利用WebBrowser擷取完整COOKIE介紹

來源:互聯網
上載者:User
  • 摘要:使用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 }

以上為你介紹的是C#利用WebBrowser擷取完整COOKIE,希望對你有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.