C# 关于爬取网站数据遇到csrf-token的分析与解决

某航空公司物流单信息查询,是一个post请求。通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使用避免CSRF攻击机制,直接发挥40X错误。

关于CSRF

读者自行百度

网站HTTP请求分析 

Headers

C# 关于爬取网站数据遇到csrf-token的分析与解决

Form Data

C# 关于爬取网站数据遇到csrf-token的分析与解决

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

C# 关于爬取网站数据遇到csrf-token的分析与解决

C# 关于爬取网站数据遇到csrf-token的分析与解决

这里通过查看该网站的JS源代码发现_csrf 来自于网页的head标签里

猜测cookie与 x-csrf-token是有一定的有效期,并且他们共同作用来防御CSRF攻击。

解决方案

1,首先请求一下该航空公司的网站,获取cookie与_csrf

2,然后C# 模拟http分别在head和formdata里加入如上参数,发起请求

代码

public class CSRFToken { string cookie;//用于请求的站点的cookie List<string> csrfs;//用于请求站点的token的key 以及 value public CSRFToken(string url) { //校验传输安全 if (!string.IsNullOrWhiteSpace(url)) { try { //设置请求的头信息.获取url的host var _http = new HttpHelper(url); string cookie; string html = _http.CreateGetHttpResponseForPC(out cookie); this.cookie = cookie; string headRegex = @"<meta_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; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxpjs.html