亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# 關(guān)于爬取網(wǎng)站數(shù)據(jù)遇到csrf-token的分析與解決

 更新時(shí)間:2021年01月28日 08:45:51   作者:yibey  
這篇文章主要介紹了C# 關(guān)于爬取網(wǎng)站數(shù)據(jù)遇到csrf-token的分析與解決,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

需求

某航空公司物流單信息查詢,是一個(gè)post請求。通過后臺模擬POST HTTP請求發(fā)現(xiàn)無法獲取頁面數(shù)據(jù),通過查看航空公司網(wǎng)站后,發(fā)現(xiàn)網(wǎng)站使用避免CSRF攻擊機(jī)制,直接發(fā)揮40X錯(cuò)誤。

關(guān)于CSRF

讀者自行百度

網(wǎng)站HTTP請求分析 

Headers 

Form Data

在head里包含了cookie 與 x-csrf-token  formdata 里包含了_csrf (與head里的值是一樣的).

這里通過查看該網(wǎng)站的JS源代碼發(fā)現(xiàn)_csrf 來自于網(wǎng)頁的head標(biāo)簽里

猜測cookie與 x-csrf-token是有一定的有效期,并且他們共同作用來防御CSRF攻擊。

解決方案

1,首先請求一下該航空公司的網(wǎng)站,獲取cookie與_csrf

2,然后C# 模擬http分別在head和formdata里加入如上參數(shù),發(fā)起請求

代碼

public class CSRFToken
 {
 string cookie;//用于請求的站點(diǎn)的cookie
 List<string> csrfs;//用于請求站點(diǎn)的token的key 以及 value

 public CSRFToken(string url)
 {
  //校驗(yàn)傳輸安全
  if (!string.IsNullOrWhiteSpace(url))
  {
  try
  {
   //設(shè)置請求的頭信息.獲取url的host
   var _http = new HttpHelper(url);
   string cookie;
   string html = _http.CreateGetHttpResponseForPC(out cookie);
   this.cookie = cookie;

   string headRegex = @"<meta name=""_csrf.*"" content="".*""/>";

   MatchCollection matches = Regex.Matches(html, headRegex);
   Regex re = new Regex("(?<=content=\").*?(?=\")", RegexOptions.None);
   csrfs = new List<string>();
   foreach (Match math in matches)
   {

   MatchCollection mc = re.Matches(math.Value);
   foreach (Match ma in mc)
   {
    csrfs.Add(ma.Value);
   }
   }

  }
  catch (Exception e)
  {

  }
  }
 }

 public String getCookie()
 {
  return cookie;
 }
 public void setCookie(String cookie)
 {
  this.cookie = cookie;
 }
 public List<string> getCsrf_token()
 {
  return csrfs;
 }
 }

httpHelper

public string CreatePostHttpResponse(IDictionary<string, string> headers, IDictionary<string, string> parameters)
  {
   HttpWebRequest request = null;
   //HTTPSQ請求 
   UTF8Encoding encoding = new System.Text.UTF8Encoding();
   ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
   request = WebRequest.Create(_baseIPAddress) as HttpWebRequest;
   request.ProtocolVersion = HttpVersion.Version10;
   ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
   request.Method = "POST";
   request.ContentType = "application/x-www-form-urlencoded";
   // request.ContentType = "application/json";
   request.UserAgent = DefaultUserAgent;
   //request.Headers.Add("X-CSRF-TOKEN", "bc0cc533-60cc-484a-952d-0b4c1a95672c");
   //request.Referer = "https://www.asianacargo.com/tracking/viewTraceAirWaybill.do";

   //request.Headers.Add("Origin", "https://www.asianacargo.com");
   //request.Headers.Add("Cookie", "JSESSIONID=HP21d2Dq5FoSlG4Fyw4slWwHb0-Sl1CG6jGtj7HE41e5f4aN_R1p!-435435446!117330181");
   //request.Host = "www.asianacargo.com";


   if (!(headers == null || headers.Count == 0))
   {

    foreach (string key in headers.Keys)
    {
     request.Headers.Add(key, headers[key]);
    }

   }


   //如果需要POST數(shù)據(jù)  
   if (!(parameters == null || parameters.Count == 0))
   {
    StringBuilder buffer = new StringBuilder();
    int i = 0;
    foreach (string key in parameters.Keys)
    {
     if (i > 0)
     {
      buffer.AppendFormat("&{0}={1}", key, parameters[key]);
     }
     else
     {
      buffer.AppendFormat("{0}={1}", key, parameters[key]);
     }
     i++;
    }
    byte[] data = encoding.GetBytes(buffer.ToString());
    using (Stream stream = request.GetRequestStream())
    {
     stream.Write(data, 0, data.Length);
    }
   }

   HttpWebResponse response;

   try
   {
    //獲得響應(yīng)流
    response = (HttpWebResponse)request.GetResponse();
    Stream s = response.GetResponseStream();

    StreamReader readStream = new StreamReader(s, Encoding.UTF8);
    string SourceCode = readStream.ReadToEnd();
    response.Close();
    readStream.Close();
    return SourceCode;
   }
   catch (WebException ex)
   {
    response = ex.Response as HttpWebResponse; return null;
   }

  }

 public string CreateGetHttpResponse(out string cookie)
  {
   HttpWebRequest request = null;
   //HTTPSQ請求 
   UTF8Encoding encoding = new System.Text.UTF8Encoding();
   ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
   request = WebRequest.Create(_baseIPAddress) as HttpWebRequest;
   request.ProtocolVersion = HttpVersion.Version10;
   ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
   request.Method = "GET";
   request.ContentType = "application/x-www-form-urlencoded";
   request.UserAgent = DefaultUserAgent;

   HttpWebResponse response;

   try
   {
    //獲得響應(yīng)流
    response = (HttpWebResponse)request.GetResponse();

    cookie = response.Headers["Set-Cookie"];
    Stream s = response.GetResponseStream();

    StreamReader readStream = new StreamReader(s, Encoding.UTF8);
    string SourceCode = readStream.ReadToEnd();
    response.Close();
    readStream.Close();
    return SourceCode;
   }
   catch (WebException ex)
   {
    response = ex.Response as HttpWebResponse;
    cookie = "";
    return null;
   }

  }

爬取程序

爬取結(jié)果

瀏覽器結(jié)果

注意事項(xiàng)與結(jié)論

1,不同的網(wǎng)站,獲取cstf的方式不一樣,無論怎么做,只要信息傳到前臺我們都可以有相應(yīng)的方法來獲取。

2,請求時(shí)候的http驗(yàn)證可能不一樣,測試的某航空公司物流信息的時(shí)候,http請求的安全協(xié)議是tis12。

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; 還有其他參數(shù)比如UserAgent后臺可能也會驗(yàn)證

3,基于如上航空公司,發(fā)現(xiàn)它的cookie和cstf_token一定時(shí)間內(nèi)不會改變,那么當(dāng)實(shí)際爬取的時(shí)候可以考慮緩存cookie以及cstf_token,只有當(dāng)請求失敗的時(shí)候,才重新獲取

相關(guān)文章

  • C#最簡單的關(guān)閉子窗體更新父窗體的實(shí)現(xiàn)方法

    C#最簡單的關(guān)閉子窗體更新父窗體的實(shí)現(xiàn)方法

    原理就是將子窗體最為對話框模式彈出,當(dāng)窗體關(guān)閉或取消時(shí)更新主窗體
    2012-11-11
  • C# 使用Word模板導(dǎo)出數(shù)據(jù)的實(shí)現(xiàn)代碼

    C# 使用Word模板導(dǎo)出數(shù)據(jù)的實(shí)現(xiàn)代碼

    最近接到個(gè)需求,使用word模板導(dǎo)出數(shù)據(jù),怎么實(shí)現(xiàn)這個(gè)需求呢,今天小編通過實(shí)例代碼給大家介紹C# 使用Word模板導(dǎo)出數(shù)據(jù)的方法,感興趣的朋友一起看看吧
    2021-06-06
  • C#操作session的類實(shí)例

    C#操作session的類實(shí)例

    這篇文章主要介紹了C#操作session的類,實(shí)例分析了C#針對session的添加、讀取及刪除等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#中HttpWebRequest的用法詳解

    C#中HttpWebRequest的用法詳解

    這篇文章主要介紹了C#中HttpWebRequest的用法,以實(shí)例的形式詳細(xì)敘述了HttpWebRequest類中GET與POST的用法,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • unity實(shí)現(xiàn)QQ截圖功能

    unity實(shí)現(xiàn)QQ截圖功能

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)QQ截圖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 基于c#用Socket做一個(gè)局域網(wǎng)聊天工具

    基于c#用Socket做一個(gè)局域網(wǎng)聊天工具

    目前基于Internet的即時(shí)聊天工具已經(jīng)做的非常完美,本文介紹了基于c#用Socket做一個(gè)局域網(wǎng)聊天工具,有需要的朋友可以看一下。
    2016-10-10
  • C#判斷字符串不等于空的方法小結(jié)

    C#判斷字符串不等于空的方法小結(jié)

    在C#中,要判斷一個(gè)字符串是否不等于空(即它既不是null也不是空字符串""),方法有如下幾種,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • C#中匿名方法與委托的關(guān)系介紹

    C#中匿名方法與委托的關(guān)系介紹

    這篇文章介紹了C#中匿名方法與委托的關(guān)系,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • c#判斷輸入的是不是數(shù)字的小例子

    c#判斷輸入的是不是數(shù)字的小例子

    c#判斷輸入的是不是數(shù)字的小例子,需要的朋友可以參考一下
    2013-03-03
  • C#入門教程之集合ArrayList用法詳解

    C#入門教程之集合ArrayList用法詳解

    這篇文章主要介紹了C#入門教程之集合ArrayList用法,結(jié)合具體實(shí)例分析了C#中集合的概念、功能、創(chuàng)建與使用方法,需要的朋友可以參考下
    2017-06-06

最新評論