HTTP协议简介
HTTP是超文本传输协议,信息是明文传输的,而HTTPS是安全超文本传输协议,需要证书和提供安全连接,换句话说,HTTPS是嵌套了SSL加密的HTTP连接,其内容由SSL先加密,然后再传输。
简单来讲,HTTPS是加过密的HTTP。由于网络上传输的数据是加密的,用户在浏览网页时,除了用户自己可以看到当前在看什么网页,其他第三方是无法得知用户在做什么的。比如用户在网上登录或输入其他敏感信息进行传输时一旦使用HTTPS,那么数据传输就不是明文了,对于第三方来讲就无法获取你的敏感信息。
Fiddler简介
官网:https://www.telerik.com/fiddler
Fiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够设置断点,篡改及伪造Request/Response的数据,修改hosts,限制网速,http请求性能统计,简单并发,接口测试,辅助自动化测试,等等。现在抓包工具成为测试人员的必备使用工具,开发人员也在普遍使用,进行问题的定位分析,是非常有助于工作的一款工具。
Fiddler工作原理
先来看看fiddler未参与时,一个普通的客户端与服务端的请求流程图:浏览器访问一个网站:www.lotaai.com,浏览器给webserver发送一个Request,webserver接收到Request后进行处理,返回给浏览器Response,然后浏览器解析Response中的html,展现网页给用户。如图:
Fiddler工作位于七层中的应用层,在client和webserver之间以代理服务器的形式存在,启动fiddler后会监听本地127.0.0.1的8888端口(默认端口8888),IE/Chrome浏览器会自动设置局域网代理(Firefox代理是独立的,需要单独设置代理)。
设置代理后,fiddler就作为代理服务器,浏览器访问www.lotaai.com 的流程:浏览器给webserver发送一个Request,代理服务器fiddler接收到Request,fiddler将Request发送给webserver,webserver接收到Request后进行处理,Response到代理服务器fiddler,fiddler将Response返回到浏览器,如图:
配置Fiddler解密HTTPS流量
启用HTTPS流量解密
- tools > options >https
- 勾选capture HTTPS connects > Decrypt HTTPS traffic
ignore server certificate errors(忽略服务器证书错误)
跳过特定主机的流量解密
- tools > options > https
- 输入跳过解密的主机名
跳过应用程序的流量解密
在OnBeforeRequest 函数* 中添加一个这样的规则
在Rules > Customize Rules 中:
if (oSession.HTTPMethodIs("CONNECT") && oSession["X-PROCESSINFO"] && oSession["X-PROCESSINFO"].StartsWith("outlook"))
{
oSession["x-no-decrypt"] = "boring process";
}
如图:
仅解密来自一个主机的流量
在OnBeforeRequest函数*中添加一个规则:
在Rules > Customize Rules 中:
if (oSession.HTTPMethodIs("CONNECT") &&
!oSession.HostnameIs("SiteICareAbout.com"))
{
oSession["x-no-decrypt"] = "do not care.";
}
如图:
Fiddler界面
Fiddler基本界面
参考网址:http://www.codeweblog.com/web调试工具fiddler教程/
Inspectors 下可以查看很多 Request和Response的消息,其中Raw 可以查看完整的消息,Headers 只查看消息中的Header。
Fiddler的HTTP统计视图
通过陈列出所有的HTTP通信量,fiddler可以很容易的展示文件生成了当前请求的页面。使用Statistics页签,用户可以通过选择多个会话来得到这几个会话的总信息统计,比如多个请求和传输的字节数。
选择第一个请求和最后一个请求,可获得整个页面加载所消耗的总体时间。从条形图表中还可以分别出哪些请求耗时最多,从而对页面的访问进行访问速度的优化
QuickExec命令行的使用
Fiddler的左下角有一个命令行工具,QuickExec,可以直接输入命令。
常见的命令有:
Help 打开官方的使用页面介绍,所有的命令都会列出来。
cls 清屏(ctrl+X也可以)
select 选择会话的命令
?.png 用来选择png后缀的图片
bpu 截获request
Fiddler中设置断点修改request
Fiddler最强大的功能莫过于设置断点,设置好断点后,可以修改httpRequest的任何信息包括host,cookie或者表单中的数据。设置断点有两种方法。
第一种:打开fiddler点击Rules > Automatic Breakpoint > Before Requests.(这种方法会中断所有的会话)
如何消除命令: 点击 Rules > Automatic Breakpoint > Disabled
第二种:在命令行中输入命令:bpu www.baidu.com (这种方法只会中断www.baidu.com)
如何消除命令: 在命令行中输入命令 bpu
案例:
模拟微信客服平台(http://wx.lotaai.com/user/login/index)登录页面,输入错误的用户名和密码,用fiddler中断会话,修改正确的用户密码,这样就能登录成功了。
- 用浏览器(Chrome)打开微信客服平台登录界面http://wx.lotaai.com/user/login/index
- 打开fiddler,在命令行中输入bpu http://wx.lotaai.com/user/login/index
- 输入错误的用户名和密码,点击登录
- Fiddler能中断这次会话,选择被中断的会话,点击Inspectors 下的WebForms 修改用户名和密码。然后点击Run to Completion
- 结果正确登录到微信客服平台。
Fiddler中设置断点修改response
第一种: 打开fiddler 点击 Rules > Automatic Breakpoint > After Response (这种方法只会中断所以的会话)
如何消除命令 : 点击 Rules >Automatic Breakpoint > Disabled
第二种: 在命令行中输入命令 :bpafter www.baidu.com (这种方法只会中断www.baidu.com)
如何消除命令 : 命令行中输入命令: bpafter,
原理图:
Fiddler中创建Auto Responder规则
Fiddler的Auto Responder 允许从本地返回文件,而不用http request 发送到服务器上。
案例:
- 打开洛唐首页(www.lotaai.com),把洛唐的logo图片保存到本地,并且对图片做一些修改。
- 打开fiddler找到图片:http://wx.lotaai.com/resources/marketing-system/images/nav.jpg ,把这个会话拖到Auto Responder 下,
- 选择Enable rules 和Unmatched request passthrough
- 在下面的Rule Editor 下面选择Find a file… 选择本地保存的图片,最后点击save 保存下。
- 在用浏览器打开首页,会看到图片用的是本地的图片了。
Fiddler中如何过滤会话
每次使用fiddler,打开网站都能在fiddler中看到十几个会话,最好的办法就是过滤掉这些会话,比如过滤掉图片会话等。Fiddler中有过滤的功能,在右边filters 中。
需要将过滤器选项filters勾选上,在进行设置。
参考网址:https://www.cnblogs.com/zhaoyanjun/p/7068948.html
Use Filters
默认情况下页面是灰色的,代表不过滤任何请求,现在勾选Use Filters 。
Actions
当所有配置完成后,点击actions中的Run Filterset now 。就可以立即生效了。同时可以维护多套filters,在不同的情形下加载不同的filters,在Actions中可以把当前的filters保存起来,也可以加载以前保存的filter。
配置过滤请求的主机Hosts
No Zone filter :不做任何过滤。
Show only Intranet Hosts :只显示内部网络主机。
Show only Internet Hosts : 只显示互联网主机。
这里主机选择第一项,不做任何过滤。
在hosts第二个下拉框有几个选项
No Host filter :不做任何过滤
Hide the following Host :隐藏下面主机的包
Show only the following hosts :显示下面主机的包
Flag the following Hosts :标记下面主机的包
注:标记下面主机的包的意思是:
输入指定的过滤的主机,多个主机可以用 ;隔开
这就实现了对所有的 www.baidu.com和https://www.baidu.com的包的过滤。
如何正确的填写文本框的内容,可以在会话列表中hosts 列里面找到请求的Host。
但是也有看到请求知乎的网站 Host列显示很多Tunnel to 的字段,请求的URL:https://www.zhihu.com/
Client Process
设置了过滤的方式,过滤的主机,现在可以选择进程了。
选择自己需要的进程即可。
其他的两个一个是IE,一个是隐藏来自service host 的请求,这里不作处理。
根据request header的filter
Show only if URL contains 和 Hide if URL contains 使用方法类似 功能相反。都是url中包含某些字符的filter,多种情况空格分隔。支持正则表达式和完全匹配,如下是个例子,可以简单理解为隐藏所有js和css请求。
断点
fiddler 是有断点功能的,可以在请求发送时断住,之后修改请求,再发送。当然也可以在响应的时候断住,做修改。而且 fiddler 还可以模拟响应,根本不发送给server 端,在项目开发阶段,server 端没有准备好 API 这个就特别有用了,或者用了复现一些问题。
根据服务器响应吗类型过滤
这部分是根据响应类型和大小的filter,前一半是显示隐藏的filter,后一部分是 block 的filter。block的filter也挺有意思,如果你选中了block css那么浏览器就加载不到css了。
根据服务器响应的header 过滤
是对response header的flag和修改。比较有用的是如果你想知道哪些请求修改了cookie那么就可以选中第一个checkbox。
Fiddler中会话比较功能
选中2个会话,右键然后点击 Compare,就可以用WinDiff来比较两个会话的不同了(这里需要安装windiff)
Fiddler中提供的编码小工具
点击fiddler工具栏上的TextWizard,这个工具可以Encode和Decode string。
Fiddler中会话查询
用快捷键ctrl+F打开find Session 的对话框,输入关键字查询需要的会话。查询到的会话会用黄色显示。
Fiddler中保存会话
将会话保存,以后分析。保存会话步骤如下:
File > save > selected sessions
Fiddler的script系统
Fiddler最复杂的莫过于script系统了 官方的帮助文档:http://www.fiddler2.com/Fiddler/dev/ScriptSamples.asp
首先先安装SyntaxView插件,Inspectors > Get Syntaxview > Download and Install SyntaxView… 如下图:
案例:
让洛唐技术网站的会话显示为红色。
需要将脚本放在OnBeforeRequest(oSession:Session)方法下,并且保存。
if (oSession.HostnameIs("www.cnblogs.com")) { oSession["ui-color"] = "red"; }
如图:
弱网络环境模拟限速测试流程
Fiddler 是一个HTTP调试代理,它能够记录所有电脑与互联网之间的HTTP通讯,fiddler也可以让你检查所有的HTTP通讯,设置断点,以及修改所有的“进出”数据。(指coookie,html,js,css)
利用fiddler来模拟恶劣的网络环境,实现简单,较为直观,缺点是只能支持那些利用HTTP进行通信和交互的服务。
打开fiddler,默认情况下Rules -> Performances – >Simulate Modem Speeds是未勾选状态,网络正常。当选中此选项(模拟光猫网速)后,网速就会变得很慢,打开一个网页要加载很久。这样就实现了弱网效果。
若需要上传和下载网速的具体数值,可以使用一个工具speedtest。建议访问http://www.speedtest.cn/网站,测速生成结果很快且是中文的。支持手机客户端APP下载。
限速原理
Fiddler限速是以网络延迟的方式实现的,网络延迟时间*网速=传输字节数。
1、点击Rules ->Customize Rules(快捷键Ctrl+R),打开Fiddler ScriptEditor,或者直接点开右侧主页签的FiddlerScript。
2、打开该文件后,Ctrl+F 查找m_SimulateModem标志位,可以看到一下代码:
注释说明: request-trickle-delay中的值代表每KB的数据被上传时会被延时多少毫秒;response-trickle-delay则对应下载时每KB的数据会被延时多少毫秒。比如你要模拟上传速度100KBps的网络,那上传延迟就是1KB/100KBps=0.01s=100ms,就改成100。
3、当勾选了Simulate Modem Speeds时,request-trickle-delay 与 response-trickle-delay就会被设置,如果本身网速已经相当快的话,这里设置的值就可以近似地推算出开启模拟后的上传和下载带宽了,比如默认设置下上传延时为300ms下载延时为150ms,可以推算出大致的模拟带宽为:
上传带宽=(1 * 8/1000) /0.300 ≈ 0.027Mbps
下载带宽=(1 * 8/1000) /0.150 ≈ 0.053Mbps
由此可见:下载宽带是上传的两倍,也就是延时越小,宽带越大。宽带和这里的延时是成反比的。
调整网络环境参数
Fiddler 默认的 Simulate Modem Speeds速度实在太慢了,而这个限速的参数是可以调整的,如果需要再快一点可以修改配置文件Fiddler2ScriptsCustomRules.js。(如若修改勿忘备份原文件)在fiddler官网http://www.fiddlerbook.com/Fiddler/dev/ScriptSamples.asp可以找到参考示例。
下面提供两种简单的修改脚本的方法:
方法1:
查找到if(m_SimulateModem)语句,修改代码。下面的脚本实现了一个随机延时量设置,使得网络宽带不是恒定为一个低速的值,而是会在一定范围内随机抖动:
static function randInt(min, max) {
return Math.round(Math.random()*(max-min)+min);
}
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = ""+randInt(1,50);
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = ""+randInt(1,50);}
方法2:
点击fiddlerScript在代码里找到onBeforeRequest,这里定义了在发送请求前做什么。加入如下代码可以实现延迟:
oSession["request-trickle-delay"]="3000"; //请求阶段延迟3秒oSession["response-trickle-delay"]="3000"; //响应阶段延迟3秒
上面两种方法选其一,修改后保存配置文件(Ctrl+S)或者清掉缓存(Rules –> Performances –>Disable Caching),再次勾选Rules –> Performances –> Simulate Modem Speeds 进行测速。注意:每次编辑并保存配置文件后,Simulate Modem Speeds选项会被取消,请重新勾选。
限速完毕一定要取消勾选,不然会影响上网。像第二种方法由于请求和响应都延迟3秒,会导致访问网页很慢。
接口测试数据保留
抓包重新问题时,可以将接口保存下来,重新点一下Execute即可调用。(根据实际情况修改请求数据),如下:
点击Execute,在会话列表中会新产生一条请求:
修改电脑系统hosts
使用绑定hosts在本地开发调试的场景越来越多,当预发环境和生产环境共用同一个域名时,通过绑定hosts的方式将访问的域名原本指向生产服务器,强制指向预发服务器上。例如将www.baidu.com指向 www.lotaai.com对应的服务器上,www.lotaai.com对应的服务器公网ip:120.76.85.232,配置如下:Tools - > Hosts –> 勾选Enable remapping of requests for one host to a different host or IP ,overriding DNS 。然后host编辑区域,输入需要域名 需要指向的服务器公网IP,比如将www.baidu.com域名指向了120.76.85.232,保存即可。(不使用host,勾去掉即可)
此时,电脑浏览器访问www.baidu.com ,结果打开的内容是120.76.85.232的内容。
例如:
同时抓包结果如下:
简单并发测试
在测试中,这样的场景也非常多,比如被测平台可以有多种货币,有可能从一种货币可以直接兑换成另一种平台货币,在兑换的时候,要多关注下两点安全:数据篡改及并发情况,数据篡改要测试扣减A货币时,篡改金额为负值或金额变少,那么兑换到B货币的数据校验,这个有点类似支付拿少的钱买多的东西,这里就不过多描述了。另外,并发情况,再比如经常会有一些活动相关的测试,假如抽奖活动,一般都有限制一个人一天只能抽一次,那么抽奖的时候同一个用户并发,会不会领取多次奖励。当然最好还是要有正规的压测,或者在测试中可以借助fiddler做一个简单的并发测试,都是很有必要的。
一个人一天只能有一次抽奖机会,那么在点击抽奖按钮发出请求之前,要设置Before Requests Breakpoints,点击抽奖后在会话列表中会看到一个被断点的请求,此时鼠标选中此请求,按shift+u,会弹出并发次数的设置,如下,设置并发次数5次(下面演示截图是发布帖子并发时的截图,可参考)
点击OK,次数会话列表就多出5个请求,如下:
此时,点击工具栏“GO”,六个请求同时发到对应的服务端,即可形成6个并发请求,再看看发表帖子的情况如下:
显示出服务器IP方法
Fiddler默认配置中是看不到服务器IP的,接下来简单介绍下在fiddler上也能够看到请求的服务器IP:
1、fiddler - > Rules - > Customize Rules ,
2、在CustomRules.js里搜索找到 :static function Main() ,
3、添加如下一行脚本:
FiddlerObject.UI.lvSessions.AddBoundColumn("Server IP", 120, "X-HostIP");
完整js代码如下:
static function Main() {
var today: Date = new Date();
FiddlerObject.StatusText = " CustomRules.js was loaded at: " + today;
// Uncomment to add a "Server" column containing the response "Server" header, if present
FiddlerObject.UI.lvSessions.AddBoundColumn("Server IP", 120, "X-HostIP");
}
添加完成后,重启fiddler,就可以显示请求的服务器IP。