Fiddler抓包基本使用

Fiddler抓包基本使用,第1张

Fiddler_官方网站

Fiddler_官方文档

Fiddler_官方视频

Fiddler_官方插件

1、Filddler简介

Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于事件脚本的子系统,并且能使用.net语言进行扩展。

2、Filddler工作原理

Fiddler是以代理WEB服务器的形式工作的,浏览器与服务器之间通过建立TCP连接以HTTP协议进行通信,浏览器默认通过自己发送HTTP请求到服务器,它使用代理地址:127.0.0.1, 端口:8888. 当Fiddler开启会自动设置代理, 退出的时候它会自动注销代理,这样就不会影响别的程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler.

4、界面介绍

4.1 Fiddler主界面

4.2 工具面板

工具栏说明:说明注释、重新请求、删除会话、继续执行、流模式/缓冲模式、解码、保留会话、监控指定进程、寻找、保存会话、切图、计时、打开浏览器、清除IE缓存、编码/解码工具、d出控制监控面板、MSDN、帮助。

两种模式:

1、 缓冲模式(Buffering Mode): Fiddler直到HTTP响应完成时才将数据返回给应用程序。可以控制响应,修改响应数据。但是时序图有时候会出现异常

2、流模式(Streaming Mode): Fiddler会即时将HTTP响应的数据返回给应用程序。更接近真实浏览器的性能。时序图更准确。但是不能控制响应。

4.3会话面板

4.4 监控面板

统计报表

(1) 请求总数、请求包大小、响应包大小;

(2) 请求起始时间、响应结束时间、握手时间、等待时间、路由时间、TCP/IP传输时间;

(3) HTTP状态码统计;

(4) 返回的各种类型数据的大小统计以及饼图展现。

时间轴

每个网络请求都会经历域名解析、建立连接、发送请求、接受数据等阶段。把多个请求以时间作为 X 轴,用图表的形式展现出来,就形成了瀑布图。在Fiddler 中,只要在左侧选中一些请求,右侧选择Timeline标签,就可以看到这些请求的瀑布图

1)绿色的请求表示这是一个“有条件的请求”。HTTP 协议定义了 5 个条件请求头部,最常见的两个是“If-Modified-Since”和“If-None-Match”。服务器根据这两个头部来验证本地缓存是否过期,如果过期则正常返回资源的最新版本;否则仅返回 304 Not Modified,浏览器继续使用本地缓存。包含条件请求头部的请求用绿色显示,否则用黑色。

2)有阴影线的请求是缓冲模式下的请求,实心的是流模式下的请求。Fiddler 提供了缓冲(Buffering)和流(Streaming)两种抓包模式:缓冲模式下,Fiddler 会在响应完成时才将数据返回给应用程序(通常是浏览器),这种模式下可以控制响应,方便地修改响应内容;流模式下,Fiddler 会实时返回响应数据给浏览器,但没办法控制响应。一般使用流模式,瀑布图会更真实一些。这两种模式可以通过 Fiddler 的工具栏选择。特别的,通过 Fiddler 的“AutoResponder”功能返回的响应,只能是缓冲模式。

3)请求条的不同颜色对应着不同类型的响应,根据响应头的 MIME Type 来归类。如浅绿色表示图片类型的响应;深绿色是 JavaScript;紫色是 CSS;其它都是蓝色。

4)请求中的黑色竖线,表示的是浏览器收到服务端响应的第一个字节这一时刻。这个时间受 DNS 解析、建立连接、发送请求、等待服务端响应等步骤的影响。

5)请求条后面的图标表示响应的某些特征。如软盘图标表示这个响应正文从本地获得,也就是说服务端返回了 304;闪电表示这是 Fiddler 的“AutoResponder”的响应;向下的箭头表示响应是 302,需要重定向;红色感叹号说明这个请求有错误发生(状态码是 4XX 或 5XX)。特别的,如果请求条后面有一个红色的X,说明服务端响应完这个请求之后,断开了连接。出现这种情况一般有两种可能:HTTP/1.0 的响应中没有 Connection: Keep-Alive;或者是 HTTP/1.1 的响应中包含了 Connection: close。使用持久连接可以省去建立连接的开销,也可以减小 TCP 慢启动和其它拥塞控制机制带来的影响,总之是好处多多。

6)请求前面的红色圆圈表示这个连接是新建的,绿色表示是复用的。上面的圆圈表示的是浏览器到 Fiddler 的连接,下面的圆圈是 Fiddler 到服务端的连接。

4.5 状态面板

控制台

Fiddler的左下角有一个命令行工具叫做QuickExec,允许你直接输入命令。

help 打开官方的使用页面介绍,所有的命令都会列出来

cls清屏 (Ctrl+x 也可以清屏)

select 选择会话的命令

?.png 用来选择png后缀的图片

bpu 截获request

bpafter 截获response

5、HTTP协议简介

5.1、HTTP消息的结构

5.1.1、Request

先看Request 消息的结构, Request 消息分为3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之间有个空行。第一行中的Method表示请求方法,比如"POST","GET", Path-to-resoure表示请求的资源, Http/version-number 表示HTTP协议的版本号,当使用的是"GET" 方法的时候, body是为空的。

5.1.2、Response

5.2 状态码

Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

1XX —— 提示信息,表示请求已被成功接收,继续处理

2XX —— 成功,表示请求已被成功接收,理解,接受

3XX —— 重定向,要完成请求必须进行更进一步的处理

4XX —— 客户端错误,请求有语法错误或请求无法实现

5XX —— 服务器端错误,服务器未能实现合法的请求

常见响应码说明:

200:响应成功,这表明该请求被成功地完成,所请求的资源发送回客户端

302:重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request

304:代表上次的文档已经被缓存了, 还可以继续使用,例如打开博客园首页, 发现很多Response 的status code 都是304

[提示: 如果你不想使用本地缓存可以用Ctrl+F5 强制刷新页面]

400 : 客户端请求与语法错误,不能被服务器所理解

403:服务器收到请求,但是拒绝提供服务

404 :找不到网页,请求的资源不存在

500 : 服务器发生了不可预期的错误

503 :服务器当前不能处理客户端的请求,一段时间后可能恢复正常

6、 常用功能

6.1 监听HTTPS

6.3 模拟各类场景

通过GZIP压缩,测试性能

模拟Agent测试,查看服务端是否对不同客户端定制响应

模拟慢速网络,测试页面的容错性

禁用缓存,方便调试一些静态文件或测试服务端响应情况

6.4 Compare(对比文本)

Fiddler中设置断点修改Response跟断点修改Request用法差不多。

参考文档: http://www.cnblogs.com/FounderBox/p/4653588.html?utm_source=tuicool&utm_medium=referral

http://kb.cnblogs.com/page/130367/

通过FiddlerScript实现根据条件重发请求

Fiddler是个强大的Web调试工具,具体的功能不在此多述,可以参考后面的链接以及Fiddler官网的手册。本文主要介绍Fiddler的重发请求功能,并通过自定义脚本实现根据条件来重发请求。 在进行Web调试时,经常会遇到浏览器请求正常但是程序请求异常的情况,这时我们常常需要使用Fiddler对比这两个请求的异同,然后将一个请求改变参数或HTTP头进行重发来查看返回结果的差异,这样可以确定哪个参数或哪个HTTP头导致的问题。如下图重发可以有多种不同的选择,常用的有三个:

Reissue Requests: 直接重发选定请求

Reissue and Edit: 重发选定请求,并在请求之前断点,可以对请求进行修改

Reissue from Composer: 将选定请求送到Composer窗口,和将请求拖拽到Composer效果是一样的,在Composer窗口中可以对请求有更精确的控制

请点击输入图片描述

只简单的重发指定请求,或在指定请求上进行编辑往往是不够的,在项目中我们偶尔会遇到这样的情形:先发送请求A,然后根据请求A结果中的某个值来发送请求B,譬如有这样的两个接口:get_random_server.php接口通过接收的数据随机返回一个服务器ID,get_data.php接口则根据刚刚的服务器ID来获取数据。下面是一个示例:

localhost/get_random_server.php?data=Hello ->返回JSON结果:{ success: true, sid: 2 }

localhost/get_data.php?sid=2

这个时候Fiddler的可扩展性就能大显神威了,可以通过两种方式实现Fiddler的扩展:FiddlerScript和插件机制,这里使用FiddlerScript就足够应付了。在Fiddler的菜单项Rules中选择Customize Rules...就可以打开Fiddler的自定义脚本文件CustomRules.js,该脚本一般保存在\Documents\Fiddler2\Scripts目录下。我推荐使用Fidder ScriptEditor进行脚本的编辑,Fidder ScriptEditor具有语法高亮和语法检查的功能,并在右侧面板提供了Fiddler内置的函数列表。 通过展开浏览右侧的函数列表,就基本上可以大概的了解到几个可能会用到的函数了:

FiddlerApplication.oProxy.SendRequest

FiddlerApplication.oProxy.SendRequestAndWait

FiddlerObject.utilIssueRequest

我们先通过下面的代码来练练手,将下面的代码拷贝到CustomRules.js中并保存,Fidder ScriptEditor会自动检查语法错误,并重新加载脚本,无需重启Fiddler脚本即可生效。CustomRules.js使用的是JScript.Net语法,对于Javascipt或.C#程序员应该可以很快上手。这时在Fiddler中随便选择一条请求,点击右键,会发现最上面多了一个选择项Test Send Request,选择该项可以达到和Reissue Requests同样的功能,重发指定请求。

12345678910111213   public static ContextAction("Test Send Request")function SendRequest(oSessions: Session[]) {         if (oSessions.Length == 0) return    FiddlerApplication.Log.LogString("Sending...")         var selected: Session = oSessions[0]         var oSD = new System.Collections.Specialized.StringDictionary()    var res = FiddlerApplication.oProxy.SendRequestAndWait(selected.oRequest.headers, selected.RequestBody, oSD, null)    FiddlerApplication.Log.LogString("Request has been Send.")    FiddlerApplication.Log.LogString(res.GetResponseBodyAsString())}   

SendRequest/SendRequestAndWait函数有一个不方便之处,他的两个参数oHeaders和arrRequestBodyBytes分别是HTTPRequestHeaders和Byte[]类型,为了调用这个方法必须将HTTP的header和body转换为这两个类型,不如字符串来的简便。这个时候utilIssueRequest函数正好满足我们的定制需要,可以精确的控制一个请求的细节,类似于Composer中的Raw。下面的代码是一个使用utilIssueRequest函数的实例,具体的HTTP请求以字符串的形式拼接起来。

1234567891011121314151617181920212223242526272829303132   public static ContextAction("Probe this!")function ProbeSession(oSessions: Session[]) {         if (oSessions.Length == 0) return    FiddlerApplication.Log.LogString("Probing...")         var selected: Session = oSessions[0]    var raw = ""         // methods    var method:String = selected.RequestMethod    var url:String = selected.fullUrl    var protocol = "HTTP/1.1"    FiddlerApplication.Log.LogString(method + " " + url + " " + protocol)    raw += method + " " + url + " " + protocol + "\r\n"         // headers    for (var i:int = 0i <selected.oRequest.headers.Count()i++) {        var header = selected.oRequest.headers[i]        FiddlerApplication.Log.LogString(header)        raw += header + "\r\n"    }         // body    FiddlerApplication.Log.LogString("---")    var body = selected.GetRequestBodyAsString()    FiddlerApplication.Log.LogString(body)    raw += "\r\n" + body         FiddlerObject.utilIssueRequest(raw)    FiddlerApplication.Log.LogString("Request has been Send.")}   

HTTP请求的格式如下:

1234567891011   POST http://localhost/get_random_server.php HTTP/1.1Host: localhostConnection: keep-aliveAccept: text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,*/*q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36Accept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zhq=0.8,en-USq=0.6,enq=0.4Content-Type: application/x-www-form-urlencodedContent-Length: 23 data=%E4%BD%A0%E5%A5%BD   

后面的工作就水到渠成了,通过SendRequestAndWait获取请求A的结果,解析请求A结果获取sid参数,然后拼接HTTP请求调用utilIssueRequest函数,此处从略。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11228533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存