zoukankan      html  css  js  c++  java
  • C#下利用WebBrowser完整获取COOKIE

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

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

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

     转载请注明出处:http://www.mobans.cn/net/1524.html

    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<stringstring> __cookiedicts = new Dictionary<stringstring>(); 
    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         } 
  • 相关阅读:
    在Eclipse中对包进行增删改查
    数据库中包的使用
    自定义函数执行动态sql语句
    用SQL语句创建四个表并完成相关题目-10月18日更新
    GUID简介
    设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。
    Java基础-服务器的发送和接收
    java基础-多线程执行
    Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
    Java基础-输入输出-3.编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。
  • 原文地址:https://www.cnblogs.com/top5/p/1709457.html
Copyright © 2011-2022 走看看