• 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 }

    以上为你介绍的是C#利用WebBrowser获取完整COOKIE,希望对你有所帮助。
  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1823384.html
Copyright © 2020-2023  润新知