Fiddler抓包VSCode和探索

news2024/10/6 16:31:50

前言: 最近在使用 VSCode 调试 web 程序时,遇到一些问题,当时不知道如何是好。所以决定抓看来看一看,然后一顿操作猛如虎,成功安装了抓包软件 – Fiddler Classic。我并没有使用 Postman 这种重量级的 HTTP 测试软件,而是直接使用了 VSCode 的插件 – REST Client。然后,我发现在 Fiddler 里面居然无论如何都是看不见这个插件发出来的数据包,或者更直接一点,看不到 VSCode 的包。经过一番在互联网上的搜索,最后发现了需要在 VSCode 中配置代理才行。不过,正是这番折腾也让我重新思考起了以前一个困惑我的问题,抓包软件的工作原理是什么?我曾经对这个很好奇,知道了它是通过代理来实现的,但是这种浅显的理解,遇到问题时还是会显得束手无策。下面就让我们再去探索一番,如果每一次探索都能获取到更深一层的理解,那便是最好不过的事情了。所以学习更像是一种螺旋上升的过程,不是一蹴而就,当然了如果不持续努力就会一直原地踏步,甚至缓慢下降。

在这里插入图片描述

VSCode 抓包配置

先看看一下这个问题的解决方案吧!这里先来一个示例,查看指定QQ号的头像,这是一个在网上公开可查询的 API,我相信大家的为人,所以这里我没有使用自己的 QQ 号。

浏览器抓包测试

在这里插入图片描述

然后在 Fiddler 中可以查看该请求,注意我在上面禁用了缓存,防止因为缓存导致看不到图片了。这里可能数据包太多了,导致看不过来,可以在抓到数据包后暂停抓包或者在上面的列中进行搜索或者过滤。现在是浏览器的包,这是一切正常的,下面我们来使用 VSCode 的 REST Client 插件来请求这个接口试试。

在这里插入图片描述

VSCode 抓包测试

首先在 VSCode 中访问,这是没有问题的,可以正常请求到数据,而且它还很贴心的直接渲染成图片了。

在这里插入图片描述

这里我设置只抓取非浏览器的数据包,不然数据包太多了,看起来很麻烦。
在这里插入图片描述

然后你猜怎么着?我本来是想演示,VSCode 不配置是抓不到包的,结果今天在我自己的电脑上,它就正常了。因为我之前是在其它电脑上操作的,换了一个环境,结果它就正常了。不过现在我想要的是不正常的结果。不过,我现在对这一块也有了解,不至于像上次一样手足无措了。既然,正常了,那就直接去看下一部分,待会再聊这个话题。

在这里插入图片描述

注意:因为我使用的 VSCode 版本较新,可能是新版的配置变更了。所以我贴出来我的版本,如果你的表现或者配置与我不一致,可以考虑更新到同一版本或者更高的版本。

在这里插入图片描述

Fiddler 抓包的原理

当我们正常的访问网络服务时,忽略其它的因素的存在(专业一点应该叫透明),我们是直接访问远程服务的。然后开启代理之后,我们是通过代理来访问远程服务的,即我们先把请求发给代理,代理再去请求远程,然后把响应信息返回给应用程序。我这里使用单箭头,因为我只是画了请求的过程,哈哈,似有不妥,但是你理解就好了。

在这里插入图片描述

注意:在 Fiddler 中讨论的是 HTTP 代理,它应该是使用最广泛的了,不过代理不止只有 HTTP 代理。

所以,现在我们去看看 Fiddler,启动它之后,它会开启一个代理服务器,并监听 8888 端口。我们打开菜单,查看 connections 栏,可以看见下面这个弹窗。

在这里插入图片描述

Fiddler Classic can debug traffic from any application that accepts a HTTP Proxy. All WinINET trafic is trouted through Fiddler Classis when “File > Capture Traffic” is checked.

这里最重要的就是这个第一句了:Fiddler Classic 可以调试接受 HTTP 代理的任何应用的流量。这里的关键字是接受,所以那就有人可以 reject拒绝 喽!其它的信息,这里忽略不去理会,因为并不属于这里的重点。

注:有些软件因为一些原因,不会走代理,例如有道词典,我就没有抓到它的包(我上次见的说法是它不使用 HTTP 协议,也有可能是它不走代理,不过具体不了解,表现就是代理看不到它的请求信息)。

也就是说,Fiddler 开了一个代理服务器,所有的应用程序(接受 HTTP 代理)都会它发送请求,然后由它进行中转发送,并接受响应数据,然后再转给发送者。那你有没有想过,其它程序为什么会知道 Fiddler 的代理呢?或者它们为什么会相信一个未知的软件呢?这其实是一个很有趣的问题。因为它们并不知道 Fiddler,也不会去关心它的存在(当然了,得排除哪些不想让你调试它们的软件)。
答案其实很简单,系统代理,操作系统都是会支持网络代理功能的。但是它并不是真正工作的代理软件,只是告诉其它软件,这里启用了系统代理,因为是操作系统,所以应用软件都能知道系统启用了代理功能。

而 Fiddler 就是真正工作的 代理软件,如下图的 Gateway(网关)这里的截图。

在这里插入图片描述

然后去 Windows 中查看系统代理,不同版本的系统截图可能不一致,不过大体上也不会相差太大的。我现在使用的是 Window11,下面是我的系统的截图。不过这里居然没有设置端口而是直接在URL中指定了,可能这样也是可以正常工作的吧。所以,你现在应该大致上明白了吧。因为操作系统是支持代理这个功能的,而且这也是必须由操作系统支持的,因为通过代理上网是非常必要的功能。既然系统支持了,那么软件就不可能不支持了,否则用户启用了代理,而软件不走代理,那么就会导致软件的行为和用户的预期不一致了,这是 BUG呀!有些工作是必须通过代理上网的,代理的运用是很广泛的,例如企业内部的 VPN 服务。

在这里插入图片描述

现在的浏览器都践行这种 KISS 原则,它会自动检测到代理开启,所以不需要用户去手动配置了。不过,对于我们这些非普通的用户,还是有必要了解代理的工作原理的。不然,如果出现问题了,你就会变成真正的傻瓜了。

注:KISS(Keep It Simple and Stupid)傻瓜原则

在这里插入图片描述

VSCode 的代理配置

打开下面这个界面,然后搜索 http: proxy,可以看见下面这些配置。最上面的这个是代理配置,如果没有设置的话,它会继承 http_proxyhttps_proxy 这两个环境变量,不过我也没有设置它们,并且查看了确实没有。然后是下面的这个配置 Http: Proxy Support,它下面写着它的作用:Use the proxy support for extensions. (对插件使用代理支持),因为我这里没有在 VSCode 中开启代理,看起来是这个配置的作用。

在这里插入图片描述

在这里插入图片描述

注意:这里可以看到我改了 Http: Proxy Authorization,这个是代理认证相关的属性,我只是点击进去,它给配置了默认的 null 值,然后我就退出来了。不过,这里我也没有使用需要认证的代理,所以也没关系的。

在这里插入图片描述

在这里插入图片描述

下面我把这个配置给关掉再试一试!这个默认的配置项 override 的作用就是,对插件启用代理支持,覆盖默认的请求选项。现在改成 off,禁用插件的代理支持。然后多次请求那个查看 QQ 头像的接口,可以发现已经无法再看到相应的请求了。这里现在设置了只查看 VSCode 的请求数据。这个 code 进程就是 VSCode。所以,以后如果遇到 VSCode 无法抓包的问题就开启下面这个选项就行了(注意VSCode的版本)。下面使用 GIF 来演示关闭代理支持之后的抓包情况。

在这里插入图片描述

在这里插入图片描述

注意:因为我的 VSCode 版本较新,如果是使用的老的版本,可能需要手动配置上面的 Http: proxy,不过要小心,如果你之后关闭了代理软件,你的 VSCode 就无法联网了!!!

代理软件最常见的问题

下面举一个例子,这应该是代理软件最常出现的问题,大部分人应该都遇到过的 – 代理软件的非正常关闭。让我们先把 Fiddler 关闭,然后查看系统代理,正常情况下它是关闭的,现在让我们手动打开它,配置和之前一样。然后,接下来会发生什么呢?

在这里插入图片描述

服务中断,你的浏览器就无法访问任何网页了,就像下面这样。 不过某些软件,例如 QQ 之类的会继续正常工作,因为它不走代理(它用的不是 HTTP 协议,不过这种软件都是很复杂的了,只是说通讯的部分不使用)。这个很好解释,就像上面那那个图一样,软件把请求发给系统代理,就是 Fiddler 启动的代理服务器,然后这个服务器早就关闭了,所以所有的请求都根本没有人接收,自然就会报错了。解决办法那自然就有两个了,关闭系统代理或者重新开启 Fiddler (或者任何你使用的代理软件)。只要是用过代理软件的人,应该都会踩过这个坑,哈哈。

在这里插入图片描述

TIM(QQ) 设置代理:

在这里插入图片描述

小小的扩展

你有没有想过到底代理是怎么工作的呢?带着这个疑问,让我们进行一点微不足道的探索吧!这里我来提供一个小小的示例程序,跟着我一起去看看吧,不要弄那么复杂了,这个代码就是随便写的,展示一下简单的原理。

package main

import (
	"log"
	"net"
)

const RSP = "HTTP/1.1 200 OK\r\n" +
	"content-type: application/json; charset=utf-8\r\n" +
	"content-length: 39\r\n" +
	"server: CrazyDragon\r\n" +
	"\r\n" +
	"{\"rsp\": \"Hello, I am CrazyDragonProxy\"}\r\n"

func main() {
	// 监听本地的 9999 端口
	server, err := net.Listen("tcp", "localhost:9999")
	if err != nil {
		log.Fatal(err)
	}

	// 读取数据的切片
	data := make([]byte, 1024)
	for {
		if conn, err := server.Accept(); err == nil {
			if n, err := conn.Read(data); err == nil {
				log.Printf("%s", string(data[:n])) // 打印接受到的数据

				conn.Write([]byte(RSP)) // fake response! 随便弄一个假的响应糊弄了事
				conn.Close()
			} else {
				log.Fatal(err)
			}
		} else {
			log.Fatal(err)
		}
	}
}


先开启代理设置,配置如下:

在这里插入图片描述

然后就按照这个 GIF 中做的即可,注意我虽然开了代理,但是代理后面并没有软件,所以此时 VSCode 的插件是无法正常联网的,因为代理软件没开!!!然后我启动了代理软件(我自己写的垃圾,不过它已经可以符合一个正常的代理了),然后这个插件就可以正常工作了。

注意: 有时候开启了代理,但是 VSCode 还是不走代理,并且配置也是正常的。可以考虑重启或者 Reload Window 刷新一下,因为配置可能没更新,VSCode 没有更新系统代理的变更。

在 VSCode 中演示:

在这里插入图片描述

在浏览器中演示:

注:这里有一个小问题,似乎第一次请求会卡住,不知道为什么?所以我强制刷新一下。

在这里插入图片描述

下面这个是打印输出的部分信息,中间的方框内是接收到的访问 QQ 头像的请求,这里出现了很多 CONNECT 请求,它也是 HTTP 方法的一种,不过它不会用在 WEB 请求中。而是专门用来给 HTTPS 进行代理的,HTTPS 代理曾经也是一个难题(TLS),这就是解决方案,不过我也就了解这么多。我这里只是一个简单的 HTTP 代理,它尝试来建立连接,当然是不会成功了,哈哈。

在这里插入图片描述

所以如果访问 https 网址,效果就是这样的,这里肯定是 CONNECT 建立失败了,就是有关于 TLS 这方面的东西。所以我测试使用的是 http 的网址。

在这里插入图片描述

什么决定了使用代理

为什么有的可以选择走代理,有的可以选择不走代理呢?这是由什么决定的呢?如果你有过网络爬虫的经验,应该就能明白了。编程语言的 HTTP 客户端都是可以配置使用代理的,就以为 Go 为例:

在这里插入图片描述

因为代理是很重要的功能,所以它是一个 HTTP 客户端必不可少的功能。不过,上面也说了可以选择 no_proxy(禁用代理),所以有些软件即使使用 HTTP 协议,你也是抓不到的,因为它根本就不使用代理。风过留声,雁过留痕。既然不从代理走,代理也就根本无法感知到它们的存在了。

总结

有趣的探索结束了,我确实感觉自己收获了不少,也把以前的一些知识串联起来了。希望各位读者也能从中有所收获。

参考链接

If I have been able to see further, it was only because I stood on the shoulders of giants. 如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。

HTTP 代理原理及实现
技术分享| HTTP 代理
部分APP无法代理抓包的原因及解决方法
大厂app抓不到包怎么办?这篇文章告诉你答案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows系统kettle9.3一键安装启动

程序下载、解压 通过百度网盘下载,直接解压即可 解压之后 双击运行 程序路径 pdi-ce-9.3.0.0-428一键安装启动\pdi-ce-9.3.0.0-428\data-integration

【FA-BP预测】基于萤火虫算法优化BP神经网络回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux中常见的权限问题

目录 前言1. 目录权限2. umask3. 粘滞位结语 前言 在了解完上一篇文章 Linux权限的理解与操作 之后,还有一些比较常见的权限问题需要我们去了解。其中包括目录的权限,umask 以及 粘滞位的使用。 1. 目录权限 问题一:进入一个目录&#xff0…

STM32F4_FATFS

目录 前言 1. 文件系统简介 2. FATFS文件系统 2.1 实际演练 2.2 FATFS读书笔记整理 2.3 FAT文件系统的神秘面纱 2.3.1 引导扇区 2.3.2 引导代码 2.3.3 FSINF0信息扇区 2.3.4 FAT表 2.3.5 FAT32数据区 2.3.6 子目录 2.3.7 目录项 3. 实验程序 3.1 main.c 3.2 di…

美团面试:Oracle JDK那么好,为何要用Open JDK?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 既然 Oracle JDK 这么好,那为什么还要有 OpenJDK&…

YZ系列工具之YZ12:VBA_4种方法设计下拉列表

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

OJ第五篇

文章目录 用队列实现栈用栈实现队列设计循环队列 用队列实现栈 链接:用队列实现栈 这道题是让我们用两个队列实现一个栈,简单来说,就是利用队列来实现一个先入后出的功能,我们知道队列是先入先出,如何用两个队列来实…

Vue2基础知识(四) 自定义指令

目录 一 自定义指令1.1 定义1.2 自定义局部指令1.3 全局注册指令1.4 钩子函数1.5 动态传参1.6 使用场景 💌 所属专栏:【Vue2】😀 作 者:长安不及十里💻工作:目前从事电力行业开发🌈目标&#xf…

全国342个城市往返最短通勤时间(铁路)数据

全国342个城市往返最短通勤时间(铁路)数据 1、时间:采集时间是2022年 2、来源:12306 3、数据说明:数据采集12306数据,整理全国342个城市往返最短通勤时间,本数据是铁路包含动车、高铁所有路线…

【GESP】2023年06月图形化三级 -- 计算最终值

文章目录 计算最终值【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 计算最终值 【题目描述】 默认小猫角色,白色背景。存在一种仅支持2种操作和1个变量的编程语言: X 使变量 “X” 的值增加1X-- 使变量 “X” 的值减少 1 最初&#…

基于SAE堆叠自编码器的单维时间序列预测研究(matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

在没有康托尔对角化方法的情况下证明实数的不可数性

乔治康托尔 |图片来源: 维基百科 一、说明 对于那些对数学感兴趣的人来说,无穷大实际上可以有不同的大小,这可能是一个众所周知的事实。事实上,最著名的例子是所有实数的集合比所有自然数的集合“大”。你可能知道,这实…

Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)

文章目录 前言1、选购服务器2、部署 Docker3、前端、后端项目打包4、配置 Dockerfile5、配置 Nginx6、配置 DockerCompose6、启动 DockerCompose 完成部署7、【可选】域名 SSL证书 前言 本次整体部署操作使用阿里云服务器,这里我选择的是香港地区的2核2G ECS&…

打击勒索病毒:防御.kat6.l6st6r勒索病毒的最佳策略

导言: 我们日常生活和工作的方方面面都离不开数字化,但这也意味着面临日益复杂的网络威胁。.kat6.l6st6r勒索病毒就是其中之一,如果你的计算机感染了这种恶意软件,你的数据可能会遭到加密并要求支付赎金才能解锁。在这篇终极指南…

STM32F4_音乐播放器

目录 前言 1. WAV简介 1.1 WAVE文件的内部结构 2. WM8978简介 3. I2S简介 4. 硬件设计 5. 实验程序 5.1 main.c 5.2 I2S.c 5.3 I2S.h 5.4 WM8978.c 5.5 WM8978.h 前言 STM32F4开发板拥有全双工I2S(也就是可以同时双向进行传输,A到B传输信息的…

强化学习问题(7)--- Python和Pytorch,Tensorflow的版本对应

1.问题 之前下载的python3.8,在对应Pytorch和Tensorflow时没太在意版本,在运行一些代码时,提示Pytorch和Tensorflow版本过高,直接降下来,有时候又和Python3.8不兼容,所以又在虚拟环境搞一个Pyhon3.7&#x…

Brachistochrone:使用变分法找到最快下降曲线

一、说明 对于任何对数学和科学感兴趣的人,您可能已经知道了急速线,因为它经常在各种流行的教学频道(例如 Vsauce 和 3Blue1Brown)上谈论。虽然有多种方法可以解决急速线问题,但在这篇文章中,本文将使用变分…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数,设计算法找到只出现一次的整数?2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?(1)用一个位图…

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080,从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …

Springboot+vue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的学生考勤管理系统,采用M(model&a…