如何利用WebClient模拟登陆CSRF控制的网站

一般我们都是利用WebRequest这个类来向服务器进行数据的POST,不过很多情况下相应的服务器都有验证,看你是不是登陆,是不是来自同一个域,这些都简单,我们可以更改其属性来达到欺骗服务器。不过如果服务器做了CSRF控制,那我们怎么办?

不熟悉CSRF的可以问下G哥此为何物,这里简单介绍下。CSRF常规来讲是在表单页里放一个隐藏域,然后在表单提交的时候服务器验证POST过来的NAVEVALUE里面是不是包含此域,同时如果包含验证其值。

问题来了,在这种情况下我们POST到服务器的数据怎么写,虽然我们可以查看HTML来得知这个NAME是什么以及它的VALUE是什么,但是这个VALUE一般情况下每刷一次都是会发生变化的。那好了在我们POST的时候怎么来得到它呢?

网上常见的那些WebRequest方法肯定不行,因为它们都是用这个类先获得一个Stream,在这个Stream里面写入我们要POST到服务器的数据,可这个时候我们还不知道这个CSRF的值呢,POST过去肯定出错。理论上来讲我们要先GET一次,然后自己办法解析GET到的这个HTML,得到CSRF的值,可是接下来我们再去WebRequest.Creat打算去POST的时候,此时相当于又重新访问了一遍,它的CSRF值已经变了,看来此路不通啊。

好在我们还有WebClient可以利用,WebClient可以让我们保持一个实例即可,而WebRequest只有通过静态方法创造出来,不能通过变化URL来达到使用同一个的目的,此处可能也是在NET4里微软推出全新HttpClient的目的,用来一统HTTP访问接口的江湖。

好了,我们现在需要做的就是继承WebClient,重写相应方法,代码如下:


 1 public class CookieAwareWebClient : WebClient
2 {
3 public string Method;
4 public CookieContainer CookieContainer { get; set; }
5 public Uri Uri { get; set; }
6
7 public CookieAwareWebClient()
8 : this(new CookieContainer())
9 {
10 }
11
12 public CookieAwareWebClient(CookieContainer cookies)
13 {
14 this.CookieContainer = cookies;
15 this.Encoding = Encoding.UTF8;
16 }
17
18 protected override WebRequest GetWebRequest(Uri address)
19 {
20 WebRequest request = base.GetWebRequest(address);
21 if (request is HttpWebRequest)
22 {
23 (request as HttpWebRequest).CookieContainer = this.CookieContainer;
24 (request as HttpWebRequest).ServicePoint.Expect100Continue = false;
25 (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.5 Safari/537.36";
26 (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
27 (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8,en;q=0.6,nl;q=0.4,zh-TW;q=0.2");
28 (request as HttpWebRequest).Referer = "some url";
29 (request as HttpWebRequest).KeepAlive = true;
30 (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
31 if (Method == "POST")
32 {
33 (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded";
34 }
35 }
36 HttpWebRequest httpRequest = (HttpWebRequest)request;
37 httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
38 return httpRequest;
39 }
40
41 protected override WebResponse GetWebResponse(WebRequest request)
42 {
43 WebResponse response = base.GetWebResponse(request);
44 String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
45
46 if (setCookieHeader != null)
47 {
48 //do something if needed to parse out the cookie.
49 try
50 {
51 if (setCookieHeader != null)
52 {
53 Cookie cookie = new Cookie();
54 cookie.Domain = request.RequestUri.Host;
55 this.CookieContainer.Add(cookie);
56 }
57 }
58 catch (Exception)
59 {
60
61 }
62 }
63 return response;
64 }
65 }

可以看出,其实最关键的还是利用好CookieContainer这个类。接下来就是如何使用了,我们需要首先访问一次登陆页面,拿到HTML然后正则也好替换也好,拿到这个CSRF的VALUE,然后再将其POST相应的服务器。


 1 var cookieJar = new CookieContainer();
2 CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
3
4 // the website sets some cookie that is needed for login, and as well the ‘lt‘ is always different
5 string response = client.DownloadString("url for get");
6 string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";
7 // parse the ‘lt‘ and cookie is auto handled by the cookieContainer
8 string token = Regex.Match(response, regx).Groups[1].Value;
9 string urlforlogin = "url for login";
10 string postData =
11 string.Format("username={0}&password={1}&lt={2}", "user", "pass", token);
12 client.Method = "POST";
13 response = client.UploadString("url for login", postData);
14
15 client.Method = "GET";

到此我们就可以结束,后期就是变化不同的URL去DownloadString了,俗称爬虫,接下来就可以根据不同的业务做不同的数据分析了。

时间: 2024-08-10 05:16:07

如何利用WebClient模拟登陆CSRF控制的网站的相关文章

Node爬虫——利用superagent模拟登陆

一.概述 最近学习了node,试着写了个爬虫,这是模拟登陆的一部分. 1.需要的工具 2.superagent用法的简述 3.抓包分析 4.最小示例 二.需要的工具 nodejs,superagent,wireshark. nodejs没什么可介绍的. superagent是nodejs众多插件之一,用npm命令安装.是一个超轻的ajax api,有着可读性强,高度灵活,学习曲线低的优点. wireshark是一个抓包工具,很强大.之后我们需要用它来分析post请求与cookie. 三.supe

python3下scrapy爬虫(第五卷:利用cookie模拟登陆抓取个人中心页面)

之前我们爬取的都是那些无需登录就要可以使用的网站但是当我们想爬取自己或他人的个人中心时就需要做登录,一般进入登录页面有两种 ,一个是独立页面登陆,另一个是弹窗,我们先不管验证码登陆的问题 ,现在试一下直接登陆的爬取: 爬虫是模拟人的行为来请求网页读取数据的现在我们划分一下过程,从登陆到获取: 先看一下我们到个人中心的过程: 登陆界面->输入账号密码->进入个人中心 1 进入登陆页面 可以说是第一次请求 此时会产生相应的COOKIE值,因为你只要先进入到页面才可以进行密码输入等行为 cookie

如何模拟登陆添加了CSRF保护的网站

上次写了篇文章,内容是如何利用WebClient模拟登陆CSRF控制的网站,回复中有人还是不理解,现在另开一篇,打算说说用Python如何来登陆. 开写之前,先说下为什么webrequest不行,常规情况下,我们在利用webrequest的时候,都是如下的形式: 1 string url = "loginurl"; 2 StringBuilder sb = new StringBuilder(); 3 sb.Append("username=un"); 4 sb.A

Scrapy 爬虫模拟登陆的3种策略

1   Scrapy 爬虫模拟登陆策略 前面学习了爬虫的很多知识,都是分析 HTML.json 数据,有很多的网站为了反爬虫,除了需要高可用代理 IP 地址池外,还需要登录,登录的时候不仅仅需要输入账户名和密码,而且有可能验证码,下面就介绍 Scrapy 爬虫模拟登陆的几种策略. 1.1  策略一:直接POST请求登录 前面介绍的爬虫 scrapy 的基本请求流程是 start_request 方法遍历 start_urls 列表,然后 make_requests_from_url方法,里面执行

利用Python与selenium自动化模拟登陆12306官网!

近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境:        Windows python 3.6.5 模块:      selenium pyautogui      time 第一步: 实例化一款浏览器,并进入到12306官网 driver = webdriver.Chrome() driver.get('https://kyfw.12306.cn/otn/r

python模拟登陆实践

对于一些需要登陆的网址爬取数据,需要登录才能访问.本文介绍如何利用python进行模拟登陆 准备工具: 1.搭建django 框架 用于模拟登陆 2.fiddler抓包工具,chrome浏览器 3.pycharm   编辑器 步骤: 1.开启django 服务,这里就不多描述,直接百度一下,就能找到很多答案(记得创建一个superuser,以便后面的登陆 ) 进入 http://127.0.0.1:8000/admin/     这是django自带的后台,进行登陆时,django自带了  cs

【教程】模拟登陆百度之Java代码版

[背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模拟登陆网站 之 Python版(内含两种版本的完整的可运行的代码) C#的: [教程]模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码) 去实现对应逻辑. 此处,继续尝试,用Java代码,实现这套,模拟登陆百度,的逻辑. [折腾过程] 1.之前已经整理了一些Java代码: http://c

运维学python之爬虫高级篇(六)scrapy模拟登陆

上一篇介绍了如何爬取豆瓣TOP250的相关内容,今天我们来模拟登陆GitHub. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 抓包工具:fiddler 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 分析登陆提交信息分析登陆信息我使用的是fiddler,fiddler的使用方法就不作介绍了,大家可以自行搜索,首先我们打开github的登陆页面,输入用户名密码,提交查看fiddler获取的信息,我这

qtday02 qt做简单的加法器和模拟登陆功能

//在3t2目录下 //adder.h /* qt简单加法计算器 */ #ifndef ADDER_H #define ADDER_H #include<QDialog> #include<QLineEdit> #include<QtWidgets/QPushButton> #include<QtWidgets/QLabel> class Adder:public QDialog{ Q_OBJECT//让自定义的槽函数生效 private: QLineEdi