关于 WEB/HTTP 调试利器 Fiddler 的一些技巧分享

1、原理简介:

Fiddler 是目前最强大最好用的 Web 调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置 CGI 请求的断点,甚至修改输入输出数据。同类的工具还有httpwatch,firebug,wireshark,google审查元素。与这些基于网页浏览器的工具不同,fiddler是一个富客户端桌面工具,不仅能监听浏览器对网页的请求和对浏览器的响应(http和https请求),而且可以监听其他程序(比如java桌面应用)的http请求(当然需要额外的设置,在此不赘述)。另外,值得一提的是,即便在浏览器的调试中,它也能胜任其他工具,比如IE浏览器,当我们需要弹出一个模式对话框(modalDialog)时,这些浏览器监听插件就派不上用场了,还得fiddler出场。如果你还未曾听说过这个工具,请先阅读这篇科普文:《WEB 调试利器:Fiddler 教程》

fiddler 和常见的底层抓包(网卡) 工具不一样(如 wincap、wireshark),它是在 web server 和 web browser 之间搭了一层 proxy,所有的请求都会经过它,如下图所示:

    fiddler在客户浏览器及web服务器之间充当了一个请求及响应的代理角色,它会在本地建立一个默认代理服务,端口为8888,为此我们访问一下此端口,可见如下效果:

2、一些常用技巧介绍:

(1)Fiddler中设置断点修改Request

第一种:打开Fiddler 点击Rules-> Automatic Breakpoint  ->Before Requests(这种方法会中断所有的会话) 如何消除命令呢?  点击Rules-> Automatic Breakpoint  ->Disabled 第二种:  在命令行中输入命令:  bpu www.baidu.com   (这种方法只会中断www.baidu.com) 如何消除命令呢?  在命令行中输入命令 bpu

(2)Fiddler中设置断点修改Response

第一种:打开Fiddler 点击Rules-> Automatic Breakpoint  ->After Response  (这种方法会中断所有的会话) 如何消除命令呢?  点击Rules-> Automatic Breakpoint  ->Disabled 第二种:  在命令行中输入命令:  bpafter www.baidu.com   (这种方法只会中断www.baidu.com) 如何消除命令呢?  在命令行中输入命令 bpafter,

(3)自动重定向 AutoResponder 到本地文件

创建重定向规则,例如将目标请求是这个js的HTTP请求重定向到本地文件

请参考阿里 UED 的这篇:使用Fiddler提高前端工作效率 (实例篇)

http://www.aliued.cn/2010/04/25/use-fiddler-to-improve-efficiency-of-front-development-example.html

(4)过滤会话 session list filter:

比如你可能在debug某些网页时,会遇到上百个请求,看的你眼花缭乱,这是你可以启用 fiddler 强大的过滤机制,还可以依据正则来过滤,

如: REGEX:(empty.js.gif|__utm.gif) ,

具体你可以参考:

http://fiddler2.com/documentation/KnowledgeBase/Filters

例如:

(5)请求构建器(Request Builder)、对两个数据流进行比较

(6)文本编码和解码:开启Tools -> Text Encode/Decode

(7)模拟user-agent:Rules->Customize Rules、模拟慢速网络

(8)fiddler 打印 cgi log:

http://my.oschina.net/leejun2005/blog/65259

(9)fiddler-使用技巧:

http://vdisk.weibo.com/s/CcitC7ClCn_vr

http://vdisk.weibo.com/s/CcitC7ClCopIM

(10)FiddlerScript:

http://fiddler2.com/blog/blog/2013/07/15/understanding-fiddlerscript

(11)Filters Reference:

http://fiddler2.com/documentation/KnowledgeBase/Filters

(12)自定义列:Add Columns to the Web Sessions List:

          可以看上图的蓝色方框就是自定义列

http://fiddler2.com/documentation/KnowledgeBase/FiddlerScript/AddColumns

举个栗子:

         在 rule规则脚本的 static function Main() 函数中添加 3 列:远程ip、referer、ReturnedCookie

// The Main() function runs everytime your FiddlerScript compiles
static function Main() {
    var today: Date = new Date();
    FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today;

    FiddlerObject.UI.lvSessions.AddBoundColumn("remoteIP", 200, "X-HOSTIP");
    FiddlerObject.UI.lvSessions.AddBoundColumn("Referer", 200, "@request.Referer");
    FiddlerObject.UI.lvSessions.AddBoundColumn("ReturnedCookie", 200, "@response.Set-Cookie");
    
    // Uncomment to add a "Server" column containing the response "Server" header, if present
    // UI.lvSessions.AddBoundColumn("Server", 50, "@response.server");

    // Uncomment to add a global hotkey (Win+G) that invokes the ExecAction method below...
    // UI.RegisterCustomHotkey(HotkeyModifiers.Windows, Keys.G, "screenshot"); 
}

(13)常用fiddler命令:

选择类:?text、>size、<size、=status、@host、 blod text、select、allbut、keeponly 断点类:bpafter、bps、bpv、bpm、bpu 控制类:hide、start、stop、show、quit

其他:cls/clear、dump、g/go、help、urlreplace

例如:?text 高亮选中会话后,shift + delete 即可反选删除,这样就过滤除了你要的 session 请求。

http://fiddler2.com/documentation/KnowledgeBase/QuickExec

3、注意的问题及解决方法

(1)chrome和firefox浏览器无法被监听

fiddler安装之后,默认会在IE浏览器中安装一个fiddler的插件,所以它对IE及国内基于IE内核的各类浏览器都能实现监听,但其他内核的浏览器无法被监听。 解决办法:禁用chrome和firefox中具有代理功能的插件,比如我的chrome安装了switchSharp,禁用它或选择“使用系统代理设置”,或在switchSharp中新配置一个代理项(比如名为fiddler,用于指向代理127.0.0.1,端口8888,如下图),即可实现监听。

(2)无法代理本地web服务器的访问请求

使用fiddler的时候,我们更多的是基于本地程序的调试,可惜fiddler捕捉不了本地(localhost或127.0.0.1)的http请求。难道fiddler就束手无策了吗?当然不是。 一般我们访问安装在本地的服务器程序时,使用的localhost或127.0.0.1,默认会绕过代理,直接访问目标服务器,通过fiddler特有的请求方式,可以使本地请求及响应都被fiddler拦截。

方法一:在localhost后增加.fiddler 比如请求http://localhost:8080改为http://localhost.fiddler:8080即可 方法二:更简单,在localhost或127.0.0.1后增加一个点即可 比如http://localhost.:8080

具体请参考:http://www.ichatter.cn/2013/06/19/666/

(3)Fiddler不能监听Java HttpURLConnection请求,请看:

http://www.cnblogs.com/tt-0411/archive/2012/03/18/2404355.html

http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java

(4)Fiddler 不能监听、捕获 python urllib2 proxy、ProxyHandler 的问题:

In Fiddler2, go to the page Tools->Fiddler Options ...->Connections, remove the trailing semicolon from the value in the "IE should bypass Fiddler for ..." field and restart Fiddler2.

http://stackoverflow.com/questions/7681305/fiddler-does-not-capture-my-scripts-requests

也就是说,去掉 <-loopback> 后面的那个分号,保存然后重启你的 fiddler 即可。

4、其它

为什么想来总结一下呢,是因为最近有个测试需求,需要检测某个网页指定的 url 请求个数,Fiddler 虽然可以,但是需要人工进行,想了想准备用 JPCAP 然后封装个浏览器内核试试,做成一个自动化的工具。

JPCAP 简介:

       众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。   JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。JPCAP的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的typedef struct _ADAPTERADAPTER,getDeviceList()对应pcap_findalldevs()等等。 使用 JPCAP 实现监听利用的是所谓的“ARP欺骗”技术。具体请参考:

http://fulong258.blog.163.com/blog/static/17895044200801145924745/

最后谈谈Java里面连接操作系统网络协议栈的API。

下表显示了网络层标准的开放系统互连(OSI)模型

#

协议

Java SDK的核心APIs

7.

应用层

HTTP、FTP、SSL等

java.net.HttpURLConnection、javax.servlet.HttpServlet

6.

表示层

# 在Java里,OSI应用层和表示层没有真正区别

5.

会话层

NetBios、RCP

# Java SDK核心对OSI会话层没有支持

4.

传输层

TCP、UDP

java.net.Socket、java.net.ServerSocket、java.net.Datagram

3.

网络层

IP

Java.net.InetAddress

2.

数据链路层

PPP

# Java SDK核心对OSI数据链路层没有支持

1.

物理层

以太网、InfiniBand

# Java SDK核心对OSI物理层没有支持不过……现在有了Java 7 SDP(VM连接InfiniBand和java.net.*、java.io.*核心APIs的桥梁)

Java 7 SDP:Java套接字直接协议——直接访问OSI第一层物理层,请参考:

http://www.infoq.com/cn/articles/Java-7-Sockets-Direct-Protocol

5、推荐阅读:

(1)基于fiddler来模拟限速

http://blogread.cn/it/article/4540?f=wb

(2)Fiddler (二) Script 用法

http://www.cnblogs.com/tankxiao/archive/2012/04/25/2349049.html

(3)Fiddler的高级用法-Fiddler Script

http://cube.qq.com/?p=973

(4)Fiddler ScriptSamples

http://fiddlerbook.com/Fiddler/dev/ScriptSamples.asp

(5)fiddlerscript addcolumns

http://docs.telerik.com/fiddler/knowledgebase/fiddlerscript/addcolumns/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青蛙要fly的专栏

Android技能树 — 网络小结(2)之TCP/UDP

介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看,最好可以指出我的错误,让我也能纠正。

16330
来自专栏互联网杂技

入门webpack(下)

插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务。 Loaders和Plugins常常被...

33760
来自专栏FreeBuf

T50:一款优秀的网站压力测试工具

T50是一款网络层压力测试工具。 该工具在检查完“/usr/include/linux”之后,会选择下面的协议进行测试: a) ICMP – Interne...

50460
来自专栏L宝宝聊IT

管理ESXI网络

45550
来自专栏代码世界

计算机网络基础

计算机网络的发展及基础网络概念 问题:网络到底是什么?计算机之间是如何通信的? 早期 : 联机 ?  以太网 : 局域网与交换机 ? 广播   主机之间“一对所...

401120
来自专栏开发与安全

linux网络编程之TCP/IP基础(三):IP数据报格式和IP地址路由

一、IP数据报格式 IP数据报格式如下: ? 注:需要注意的是网络数据包以大端字节序传输,当然头部也得是大端字节序,也就是说: The most signifi...

32670
来自专栏Android中高级开发

Android开发之漫漫长途 XIX——HTTP

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

13420
来自专栏运维小白

1-1 CCNA

单工:BB机,只能收,不能发 半双工:对讲机,收的时候不能发,发的时候不能收 全双工:电话,手机,能同时收发 ---- 冲突域:当一个节点向另一个节点发送数据...

35470
来自专栏Android源码框架分析

Android 3G/4G流量上网原理简析

手机一般会提供两种上网方式:Wifi或者3G/4G上网,Wifi上网其实就是利用网卡通过以太网上网;3G/4G则是通过基带,利用蜂窝网络进行上网,之前已经简单的...

65360
来自专栏信安之路

浅谈ddos的测试方式

DOS(denial of service--拒绝服务)攻击的目的是使服务正常功能不可用。不像其他类型的攻击的目的是获取敏感信息,Dos攻击是不会威胁到敏感信息...

30700

扫码关注云+社区

领取腾讯云代金券