Fiddler使用和数据抓包
一、Fiddler使用说明
1.、Fiddler2是一个使用本地127.0.0.1:8888的HTTP代理,任何能够设置HTTP代理为127.0.0.1:8888的浏览器和应用程序都可以使用Fiddler。
二、.什么是Fiddler?
Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一。它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器。
既然是代理,也就是说:客户端的所有请求都要先经过Fiddler,然后转发到相应的服务器,反之,服务器端的所有响应,也都会先经过Fiddler然后发送到客户端,基于这个原因,Fiddler支持所有可以设置http代理为127.0.0.1:8888的浏览器和应用程序。使用了Fiddler之后,web客户端和服务器的请求如下所示:
三、Fiddler使用界面简介
其主界面如下:
1、工具栏:File\包括捕获http请求,停止捕获请求,保存http请求,载入本地session\设置捕获规则等功能。
2、菜单栏:Replay~Browse包括Fiddler针对当前View的操作(暂停、清除session、decode模式、清楚缓存等)。
3、WebSession面板:主要是Fiddler抓取到的每条http请求(每一条称为一个session),主要包含了请求的url、协议、状态码、body等信息,详细字段含义如下:
4、详情和数据统计面板。针对每条http请求的具体统计Statistics(例如发送/接收字节数、发送/接收时间,还有粗略统计各地访问服务器所花费的时间)和数据包分析,如:
(1)inspector面板下,提供headers\textview\hexview\Raw等多种方式查看单条http的请求报文的信息:
(2)Composer面板下,则可以模拟向相应的服务器发送数据。
也可以粘贴一次请求的rawhttpheaders达到模拟的请求。
(3)Filters标签则可以设置Fiddler的过滤规则,来达到过滤http请求的目的。最简单如:过滤内网http请求而只抓取internet的http请求,或则过滤相应域名的http请求。Fiddler的过滤器非常强大,可以过滤特定http状态码的请求,可以过滤特定请求类型的http请求(如css请求,image请求,js请求等),可以过滤请求报文大于或则小于指定大小(byte)的请求。
四、使用Fiddler抓包分析
1、Fiddler抓取Http请求。
抓包是Fiddler的最基本的应用,启动Fiddler后,在浏览器中随便进入一个网站,回车后,在Fiddler的WebSession界面捕获到HTTP请求如下图:
图标的意思:
五、HTTP状态码详解
六、HTTP详解
1、HTTP请求格式
Http通信协议,以“消息头/消息体”的方式分割,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么做。
HTTP协议传输的消息规定,每一个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。例如,打开一个网页,“查看源文件”,HTML代码就是HTTP的消息体,消息头则可以通过开发工具或者插件看到。
客户端通过发送HTTP请求向服务器请求对资源的访问。HTTP请求由三部分组成:请求行、请求头和请求正文。
请求行:请求方法URI协议/版本
请求头(RequestHeader)
请求正文
如下一个HTTP请求的数据:
(1)请求行:请求方法URI协议/版本
POST/index.phpHTTP/1.1请求方法URI协议和协议的版本
URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以/开头。
请求方法,HTTP1.1中的请求方式:
(2)请求头(RequestHeader)
每个头域由一个域名,冒号(:)和域值三部分组成。
HTTP常见的请求头如下:
Transport头域 |
1)Connection: 作用:表示是否需要持久连接 Connection:keep-alive Connection:close【代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。】 2)Host:(发送请求时该头域是必须的) 作用:主要用于指定被请求资源的Internate主机和端口号,通常是从HTTPURL中提取出来的; |
|
Client头域 |
1)Accept: 作用:浏览器可以接受的媒体类型(MIME类型) Eg:Accept:*/*代表浏览器可以处理所有类型 2)Accept-Encoding: 作用:浏览器申明自己接收的编码方法,通常指定压缩方法,而不是字符编码; 3)Accpet-Language: 作用:浏览器申明自己接收的语言; 4)User-Agent: 作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称版本; 5)Accept-Charset: 作用:浏览器申明自己接收的字符集; |
|
Cookie/Login头域 |
Cookie: 作用:最重要的header,将cookie的值发送给HTTP服务器; |
|
Miscellaneous头域 |
Referer: 作用:提供了Request的上下文信息的服务器,告诉我服务器我是从哪个链接过来的; |
|
Cache头域 |
1)If-Modified-Since: 作用:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。 例如:If-Modified-Since:Thu,09Feb201209:07:57GMT 2)If-None_match: 作用:If-None-Match和ETag一起工作,工作原理是在HTTPResponse中添加ETag信息。当用户再次请求该资源时,将在HTTPRequest中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.使用这样的机制将提高网站的性能 例如:If-None-Match:"03f2b33c0bfcc1:0" 3)Pragma: 作用:防止页面被缓存,Pargma只有一个用法,例如:Pragma:no-cache; 4)Cache-Control: 作用:这个是非常重要到的规则,用来指定Response-Request遵循的缓存机制。各个指令含义如下: Cache-Control:Public可以被任何缓存所缓存 Cache-Control:Private内容只缓存到私有缓存中 Cache-Control:no-cache所有的内容都不会被缓存 |
|
Entity头域 |
1)Content-Length: 作用:发送给HTTP服务器数据的长度,即请求消息正文的长度; 2)Content-Type: 作用: |
|
2、HTTP响应格式
在接收和解释请求消息后,服务器会返回一个HTTP响应消息。与HTTP请求类似,HTTP响应也由三个部分组成,分别是:状态行、消息报头和响应正文。
如下一个HTTP响应例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Hello HTTP!
1)状态行
状态行由协议版本、数字形式的状态代码以及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行,如:HTTP/1.1200OK协议版本服务器返回的响应码状态代码的文本描述
状态代码与状态描述:
1XX:指示信息——表示请求已经接受,继续处理;
2XX:成功——表示请求已经被成功接收、理解、接受;
3XX:重定向——要完成请求必须进行更进一步的操作;
4XX:客户端错误——请求有语法错误或请求无法实现;
5XX:服务器端错误——服务器未能实现合法的请求。
常用状态码以及状态描述:
200:客户端请求成功
400:BadRequest客户端请求有语法错误,不能被服务器所理解
401:Unauthorized请求未经授权,这个状态吗必须和WWW-Authenticate报头域一起使用
403:Forbidden服务器收到请求,但是拒绝提供服务
404:NotFound请求资源不存在,如输入了错误的URL
500:InternalServerError服务器发生不可预期的错误
502:ServerUnavailable服务器当前不能处理客户端的请求,一段时间后可能回复正常
2)响应正文
响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔,如:
HelloHTTP!
3)响应头信息
HTTP最常见的响应头如下所示:
Cache头域 |
1)Date: 作用:生成消息的具体时间,即当前的GMT时间; 2)Expires: 作用:浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存; 3)Vary: |
|
Cookie/Login头域 |
1)P3P: 作用:用于跨域设置Cookie,这样可以解决iframe跨域访问cookie的问题; 2)Set-Cookie: 作用:非常重要的header,用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie. |
|
Entity实体头域 |
1)ETag: 作用:和If-None_match配合使用; 2)Last-Modified: 作用:用于指示资源的最后修改日期和时间; 3)Content-Type: 作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集; 4)Content-Length: 作用:指明实体正文的长度,以字节方式存储的十进制数字来表示。 5)Content-Encoding: 作用:文档的编码方法,一般是压缩方式。 6)Content-Language: 作用:WEB服务器告诉浏览器自己响应的对象的语言者。 |
|
Miscellaneous头域 |
1)Server: 作用:指明HTTP服务器的软件信息; 2)X-Powered-By: 作用:表示网站是用什么技术开发的。 |
|
Transport头域 |
Connectio:Keep-alive |
|
Location头域 |
Location:用于重定向一个新的位置,包含新的URL地址,实例请看304状态实例。 |
|
七、Fiddler调试技巧
1、使用Fiddler进行HTTP断点调试,可以做到:
(1)修改HTTP请求头信息,例如修改请求头的UA/Cookie/Referer信息,通过“伪造”相应信息达到相应的目的(调试,模拟用户真实请求等)。
(2)构造请求数据,突破表单的限制,随意提交数据。避免页面js和表单限制影响调试。
(3)拦截响应数据,修改响应实体。
Fiddler提供了两种设置断点的方式达到上述功能:
1、Fiddler菜单栏->rules->automaticBreakpoints->选择断点方式,这种方式下设定的断点会对之后的所有HTTP请求有效。有两个断点位置:
(1)beforeresponse。也即发送请求后,但是Fiddler代理中转前,这时可以修改请求的数据。【此种调试可以在浏览器发送请求消息到Fiddler代理服务器时,手动修改用户HTTP请求头消息,针对不同的请求数据测试服务器返回的不同响应结果。】
(2)Afterresponse。也即服务器响应之后,但是在Fiddler将响应中转给客户端之前,这时可以修改响应的结果。
【为什么说上述方法很重要?一般的js前端和后台程序员是分工合作的,js程序员想要调试Ajax请求从后台获取数据的功能,这样就不需要等待服务器端程序员开发好所有接口后再开始开发js端的ajax请求功能,因为通过“模拟”真实服务端的响应,便可保证功能的正确性,而后台开发人员,只要保证最终响应式符合规定的即可。这样大大提高了程序开发的效率,当然也降低的不同业务线程序员联调的难度。】
2、命令行下输入:bpafterhost名称或者bpvbpubpm等设置断点。这种断点只针对特定类型的请求。Fiddler中设置断点修改Request,使用命令:bpuwww.baidu.com;设置断点修改Response,使用命令:bpafterwww.baidu.com。
3、终止断点的方式:
(1)在inspector界面点击“runtocomplete”即可终止本次HTTP请求的断点。
(2)输入go命令,也会使得当前的请求跳过断点。
(3)在rules->autobreakpoint中disabled断点即可。
实例:
1、设置断点,修改响应数据
(1)打开https://www.cnblogs.com/
(2)设置断点afterresponse断点后,在命令行输入bpafterwww.cnblogs.com回车,再次访问该网站,可以在web-session面板看到请求已经被挂起,如图8-1,而web浏览器也一直处于加载状态,选择被挂起的请求,在inspector面板可以看到图8-2所示:
4、Fiddler常用技巧
(1)Fiddler中设置断点修改Request;
(2)Fiddler中设置断点修改Response;
(3)自动重定向AutoResponder到本地文件:
创建重定向规则,例如将目标请求是这个js的HTTP请求重定向到本地文件。
(4)过滤会话sessionlistfilter.
本文转自《Fiddler使用和数据抓包》
文章来源: blog.csdn.net,作者:轻狂书生FS,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/LookForDream_/article/details/89382986
- 点赞
- 收藏
- 关注作者
评论(0)