当前位置: 首页 > news >正文

Web架构安全分析/http/URL/Cookie攻击

Web 架构安全分析

Web 工作机制及基本概念

传统 Web 架构

  • LAMP

    image-20231016140620362

网页
  • 概念

    网页就是我们可以通过浏览器上网看到的精美页面,一般都是经过浏览器渲染过的 .html 页面,html 语言在浏览器中渲染。其中包含了CSS、JavaScript 等前端技术。通过浏览器访问的 Web 页面大部分都是 HTML 页面。

  • 静态网页

    静态的网页,都是一些 .html 文件,是纯文本文件。这些文件中包含html 代码。

    HTML(HyperText Markup Language,超文本标记语言),浏览器会通过渲染引擎解释执行 HTML 语言。

    HTML 语言对于 Web 容器来讲就是纯文本字符串。Web 容器只负责将 HTML 语言或其他字符串(字节流)从服务器传输给浏览器。静态的页面,只能将信息从 Web 容器传递到浏览器|客户端|用户。

网站
  • 网站多个网页的集合就是网站。
Web 服务器
  • Web Server,也叫 Web 容器,主要提供 Web 服务,也就是常说的 httpd 服务。常见的 Web 容器有:Apache,IIS,Nginx 等。
中间件服务器(交互)
  • 以上这种静态网页,只能单向地给用户展示信息。随着Web 的发展,信息要双向流动,产生了交互的需求,也就是动态网页的概念。

    所谓动态就是利用Flash、PHP、ASP、JAVA、JavaScript 等技术在网页中嵌入一些可运行的脚本,用户浏览器在解释HTML 页面时,遇到脚本就启动运行它。脚本的使用让Web 服务模式有了双向交流的能力。

    Web 服务模式也可以像传统软件一样进行各种事务处理,如编辑文件、利息计算、提交表单等,Web 架构的适用面大大扩展。

    这些脚本可以嵌入在页面中,如JS 等。也可以以文件的形式单独存放在Web 服务器的目录里,如.asp、.php、.jsp 文件等。我们在静态网页与脚本都是事前设计好的,一般不经常改动,但网站上很多内容需要经常的更新,如新闻、博客文章、互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库。

    Web 开发者在Web 服务器后边增加了一个数据库服务器,这些经常变化的数据存进数据库,可以随时更新。当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用SQL 数据库语言,从数据中读取最新的数据,生成“完整”页面,最后送给用户。浏览器端看到的虽然是纯文本HTML,它后端脚本的输出(运行结果)。

    这样功能性的脚本越来越多,形成常用的工具包,单独管理,Web 业务开发时,直接使用就可以了,这就是中间件服务器,它实际上是Web 容器处理能力的扩展。

数据库出现
  • 静态网页与脚本都是事前设计好的,一般不经常改动,但网站上很多内容需要经常的更新,如新闻、博客文章、互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库。

    Web 开发者在Web 服务器后边增加了一个数据库服务器,这些经常变化的数据存进数据库,可以随时更新。当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用SQL 数据库语言,从数据中读取最新的数据,生成“完整”页面,最后送给用户。

前后端分离架构

前端

前端指的就是浏览器端展示的内容。浏览器端有Web 页面,功能逻辑,数据等内容。

  • Web 页面,HTML + CSS + JS
  • 功能逻辑,UI + JS
  • 数据展示,AJAX
后端

后端为前端提供功能支持。后端开放API 接口。

  • 页面 API 接口
  • 数据 API 接口

HTTP 协议

HTTP 概述

  • 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是浏览器(Browser)与 Web 服务器(Web Server)之间的通信协议,是传递消息的规范和要求。

  • HTTP 协议是1990 年提出的,当前最新版本3。HTTP 是用来将 HTML 文档从 Web 服务器传输到 Web 浏览器。

    即使访问 PHP 文件,浏览器端接收到并不是 PHP 文件的源代码,而是 PHP 脚本的运行结果,这个结果大部分是 HTML 文档。

  • HTTP 是一个请求响应的协议。浏览器发出请求,服务器端对请求给出回应。

  • HTTP 使用可靠的 TCP 连接,默认端口 80

  • HTTP 协议是以明文的方式在网络中传输,容易被嗅探,这个风险也叫明文传输漏洞。

    为了解决明文传输的问题,需要使用加强版的HTTP 协议 - HTTPS,在HTTP 的基础上加了一个安全套接字层 SSL(Security Socket Layer),使用默认端口443

  • HTTPS 也会有一些安全性问题,比如HTTPS 降级,“心脏滴血” 漏洞等。

HTTP 协议特点

  • 支持浏览器/服务器模式(B/S)。

  • 简单快速:浏览器向服务器提出请求时,只需要传送请求方法和请求路径。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 灵活:HTTP 允许传输任意类型的数据对象。

    文件后缀名文件类型MIME 类型
    .html纯文本text/html
    .jpg图片image/jpeg
    .mp3音频audio/mpeg
  • HTTP 协议是无状态的协议。

URL

URL 概念
  • 统一资源定位符(Uniform Resource Locator,URL),用来告诉Web 容器,浏览器所请求资源(文件)的路径。例如:

    http://10.4.7.128/cms/show.php?id=32
    ftp://fptuser:ftpuser@10.9.69.254
    
URL 构成
  • schema://login:password@address:port/path/to/resource/?query_string#fragment
    
    URL 组成说明示例
    schema协议http
    😕/
    login用户名
    :
    password密码
    address服务器地址(IP| 域名)10.4.7.128
    :
    port端口号80
    /path/to/resource请求资源路径/cms/show.php
    ?
    query_string请求参数id=32
    #
    fragment锚点

    锚点就是在<a>标签中实现页面内定位的,# 后面的内容是不会传递服务器的。

URL 编码
  • 浏览器或服务器 URL 所允许出现的字符是有限制的。URL 中从 path 开始只允许出现 A-Z,a-z,0-9,半角减号(-),下划线(_),句点(.),波浪号(~)。其他字符均会被 URL 编码(编码规则)。

    符号URL 编码
    #%23
    \%20
    &%26
    >%3e

    URL 编码是一种编码规则,它会将所有字符进行 URL 编码。浏览器或服务器中对 URL 的要求,特殊字符进行 URL 编码。URL 中的空格可用 %20,也可以用 + 来代替。

    http://10.9.65.213/cms/show.php?id=34 and 1=1
    http://10.9.65.213/cms/show.php?id=34%20and%201=1
    http://10.9.65.213/cms/show.php?id=34+and+1=1
    
  • 可以在 burpsuite 的 Decoder 模块中进行编码

    image-20231016171133080

HTTP 请求(Request)报文格式

HTTP 请求由请求行、请求头、请求正文三个部分组成。

请求行
  • HTTP 报文的第一行,由空格字符分成三部分(空格、回车和换行符不能随便出现)。

    列数实例说明
    第一列GET请求方法
    第二列/cms/show.php?id=33资源的路径和GET 参数
    第三列HTTP/1.1协议/版本
  • 常见请求方法如下:

    请求方法说明
    GET通常用于请求服务器发送某个资源
    POST通常用于表单提交或文件上传等功能
    HEAD与GET 方法类似,但在服务器响应中只返回首部(头部),没有正文。
    OPTIONS用来测试服务器所支持的方法
    TRACE回显浏览器的请求
    PUTPUT 方法会向服务器写入文档
    DELETE请求服务器删除指定的资源
请求头
  • 从请求报文第二行开始到第一个空行为止之间的内容。其中包含很多字段:

    主要字段含义
    Host主要用于指定被请求资源的服务器地址和端口号
    User-Agent客户端浏览器信息,浏览器指纹
    Referer包含一个URL,代表当前URL 的上一个URL
    Cookie记录请求者的身份认证信息,身份证
    Content-Type用于向接收方(浏览器或服务器)指示实体的介质类型(数据类型,MIME)
    Content-Length用于指明实体正文的长度,以字节方式存储的十进制数字来表示
    AuthorizationHTTP 基本认证
请求正文
  • 带有请求正文的,一般都是 POST 方法。第一个空行开始以后的所有内容。

HTTP 常见传参方式

  • GET 传参,向服务器提交的参数在 URL 中,http://ip/cms/show.php?id=33?id=33 就是通过 GET 方式向服务器提交的参数。通过 GET 向服务器传递多个参数用 & 连接 ?name=AJEST&pass=123456,以此类推即可。

    GET 方法在**? 后连接参数**

  • POST 传参,向服务器提交的参数在请求正文中,如登录功能 POST 数据包所示,向服务器提交了4个参数,& 连接

    username=admin&image.x=23&image.y=23&password=123456
    

    image-20231016172639290

HTTP 响应报文(Response)格式

状态行
  • 响应报文的第一行。

    列数示例解释
    第一列HTTP/1.1协议/版本
    第二列302响应状态码
    第三列Found描述短语
  • 常见状态码,如下:

    状态代码类型常见状态码
    1XX信息性状态码
    2XX成功状态码200| 201…
    3XX重定向状态码302| 304…
    4XX客户端错误状态码404| 403…
    5XX服务器错误状态码500
响应头
  • 响应报文第二行开始到第一个空行为止的所有内容,其中包含了关于HTTP 响应的重要字段。

    字段含义
    Date时间和日期
    ServerWeb 服务器指纹
    Last-Modified服务器通过这个头信息告诉浏览器,资源的最后修改时间
    Content-Length响应正文的长度
    Content-Type响应正文的类型
    Set-Cookie服务器向浏览器端写入Cookie 信息
    Location重定向目标页面
    Refresh服务器通过Refresh 头告诉浏览器定时刷新浏览器
响应正文
  • 响应报文从第一个空行开始到最后的所有内容。服务器返回资源的内容,即浏览器接收到的 HTML 代码。

Web 会话简述

  • 会话就是类似于浏览商品、加入购物车到支付,这样一个完整的业务流程,要求有一个账号始终保持登录状态,也就是说这个账号完成了购买商品的业务。

  • HTTP 协议本身是无状态的协议,也就是说,HTTP 协议不会记录会话状态,不同的请求之间是没有任何联系的。很多种情况,浏览器与服务器之间的会话不是一个动作(请求)就完成了的。

  • 希望在浏览器与服务器之间的这个交互的会话期间内,服务器能够保持对浏览器会话的识别,也就是保持HTTP 的状态性

Cookie 应运而生

  • Cookie(Cookies) 就是指网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端(浏览器)上一小段文本(数据,通常进行加密的)。
  • Cookie 机制提供事务管理的功能,为服务器提供会话状态管理。例如,购物车可以为每个用户实现统计;实现授权策略等。
  • Cookie 是服务器向浏览器写入的一段文本(在响应报文的Set-Cookie 字段中),并存储在浏览器中。另外,浏览器在访问该网站时会自动发送 Cookie(在请求报文的Cookie 字段中),如果服务器识别这个自动发送的 Cookie 信息,也就是说,服务器识别了会话。

  • 浏览器在访问网站的时候,会自动携带与该网站相关联的 Cookie 信息。

场景

  • 去超市购物并注册了会员,超市会发放一张会员卡。Cookie 就相当于这张会员卡,会员卡在会员手中,Cookie 在浏览器中。每次去超市买东西,一种情况是直接买,没有优惠;另外一种情况,出示会员卡,并享受打折优惠,同时,通过购物可以获取积分积累。超市会根据会员卡记录,查询积分消费情况,充值金额等等信息。

固定会话攻击

窃取
  • F12 调出控制台输入命令

    document.cookie;
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Cookie 信息:

    username=admin; userid=1; PHPSESSID=ne2q9bgvaml50b9uhvcr066fn7
    
  • 也可以在 Application 中查看 cookie 信息

    image-20231016174230576

欺骗
  • 在未登录的情况下 cookie 中无信息

    image-20231016175013457

  • 在控制台设置 cookie 信息(先前登录获取的)

    document.cookie = "username=admin;";
    document.cookie = "userid=1;";
    document.cookie = "PHPSESSID=ne2q9bgvaml50b9uhvcr066fn7";
    

    image-20231016175129098

  • url 中直接输入管理员页面的 url,无需输入用户名和密码,按下回车

    image-20231016175232438

  • 直接登录成功

    image-20231016175321723

相关文章:

Web架构安全分析/http/URL/Cookie攻击

Web 架构安全分析 Web 工作机制及基本概念 传统 Web 架构 LAMP 网页 概念 网页就是我们可以通过浏览器上网看到的精美页面&#xff0c;一般都是经过浏览器渲染过的 .html 页面&#xff0c;html 语言在浏览器中渲染。其中包含了CSS、JavaScript 等前端技术。通过浏览器访问…...

.git 目录中有什么?

好吧&#xff0c;我想你们中的大多数人每天都或多或少地使用 git&#xff0c;但是您是否研究过 git 创建的 .git 文件夹中的内容&#xff1f;本文[1]我们将一起探索一下&#xff0c;了解里面到底发生了什么。 ❝ git 在基本层面上只是一堆通过文件名相互链接的文本文件。 ❞ in…...

Debian11系统简单配置

debian11系统简单配置 网卡配置 修改/etc/network/interfaces address 192.168.0.188 gateway 192.168.0.1 netmask 255.255.255.0重启网卡systemctl restart networking.service systemctl restart networking 执行apt 报错 rootdebian:~# apt update 忽略:1 cdrom://[D…...

家装、家居两不误,VR全景打造沉浸式家装体验

当下&#xff0c;用户对生活品质要求日益提升&#xff0c;越来越多的用户对多功能家装用品需求较大&#xff0c;由此造就了VR全景家装开始盛行。VR全景家装打破传统二维空间模式&#xff0c;通过视觉、交互等功能让用户更加真实、直观的体验和感受家居布置的效果。 一般来说&am…...

Ubuntu服务器 Clash Dashboard

正文发不出来 链接&#xff1a;【Linux】解决Ubuntu服务器版本无法使用Clash Dashboard的问题 这个图展示了RNA-Seq实验数据生成的流程。下面是该流程的逐步解释&#xff1a; mRNA或总RNA提取&#xff1a;首先&#xff0c;从细胞或组织样本中提取mRNA或总RNA。mRNA是经过剪切…...

创建数据库表的命令

创建数据库表的通用语法&#xff1a; ​CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,...columnN datatype constraint ); 其中&#xff0c;table_name 为要创建的表名&#xff0c;column1 到 columnN 为表的列名&#xff0c;datatype …...

ubuntu18.04 LTS卸载qtcreator-10.0.2

之前通过命令&#xff0c;通过.run文件&#xff0c;安装了Qt Creator 默认安装路径是/opt/ 卸载 在安装路径下&#xff0c;可以看到QtCreatorUninstaller文件 命令行运行该执行文件&#xff0c;会弹出卸载窗口&#xff0c;记得勾选下面的“仅卸载”...

通过字符设备驱动并编写应用程序控制三盏灯亮灭

现象 键盘按1三灯全亮 按0三灯全灭 头文件.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…...

SpringCloud链路追踪——Spring Cloud Sleuth 和 Zipkin 介绍 Windows 下使用初步

前言 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。如何能够分析调用链&#xff0c;定位微服务中的调用瓶颈&#xff0c;并对其进行解决。 本篇博客介绍springCloud中用到的链路追踪的组件&#xff0c;Spring Cloud Sleuth和Zipkin&#xf…...

深入探究音视频开源库 WebRTC 中 NetEQ 音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、什么是NetEQ&#xff1f; 3、NetEQ技术详解 3.1、NetEQ概述 3.2、抖动消除技术 3.3、丢包补偿技术 3.4、NetEQ概要设计 3.5、NetEQ的命令机制 3.6、NetEQ的播放机制 3.7、MCU的控制机制 3.8、DSP的算法处理 3.9、DSP算法的模拟测试 4、NetEQ源文件…...

一篇文章教会你C++11入门知识点

C11入门 列表初始化1. {}初始化2. initializer_list 声明1. auto2. decltype3. nullptr 范围for循环STL新增容器1. array2. forward_list3. unordered_map和unordered_set 右值引用和移动语义1. 左值引用和右值引用2. 左值引用和右值引用比较3. 右值引用使用场景和意义4. 右值引…...

idea leetcode配置

idea leetcode配置 配置页面如下图所示&#xff0c;根据需要&#xff0c;填入登录用户名、密码、文件存放路径&#xff0c;注意如果要使用自定义的代码结构配置&#xff0c;要勾选图中框出来的选项。 Code FileName&#xff1a; $!velocityTool.camelCaseName(${question.tit…...

Golang通道(Channel)原理解析

引言 并发编程是现代软件开发中的一个重要主题。Golang作为一门并发友好的编程语言&#xff0c;提供了一种简单而强大的机制&#xff0c;即通道&#xff08;Channel&#xff09;&#xff0c;用于在不同的Goroutine之间进行通信和同步。通道的设计和原理是Golang并发模型的核心…...

使用树莓派搭建文件共享服务器-samba服务器

局域网内部通过文件共享来传输文件是一种非常方便的方式&#xff0c;小米摄像头也支持用文件共享smb模式将视频备份到局域网中的文件服务器上。之前我一直使用荣耀pro路由器游戏版&#xff0c;是自带USB接口支持文件共享服务的&#xff0c;接上USB移动硬盘&#xff0c;小米摄像…...

GitLab使用webhook触发Jenkins自动构建

1、jenkins安装gitlab插件 在插件管理中&#xff0c;搜索gitlab安装这个插件。 2、job中配置webhook地址和密钥 进入job设置&#xff0c;构建触发器中就可以看到gitlab的webhook配置&#xff0c;复制URL地址和随机令牌至gitlab中 勾选后&#xff0c;就可以展开设置&#xff…...

柔性数组的使用及注意事项

1.柔性数组在结构体当中,并且在结构体的最后面. 2.结构体中除了柔型数组外至少还要有一个其他成员. 3.sizeof()返回结构体的大小不包含柔性数组的大小. 4.malloc 例:struct sdshdr16 *p malloc(sizeof (struct sdshdr16) 32); // 32 为柔性数组的大小 5.free 例: fre…...

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集&#xff09;是一棵树&#xff0c;则称该树为图G的生成树&#xff08;支撑树&#xff09;&#xff0c;简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E)&#xff0c;每条边…...

【LeetCode】43. 字符串相乘

1 问题 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 “2”, num2 “3” 输出: “…...

车联网之电子围栏模型使用翻滚窗口【二十一】

1. 电子围栏模型使用翻滚窗口 l 创建90秒翻滚窗口,计算中电子围栏信息(ElectricFenceModel中的值根据车辆是否在围栏内进行设置) 设置电子围栏水印 根据vin进行分组 创建翻滚窗口,90秒为一个窗口周期 自定义窗口函数,计算电子围栏中和围栏外车辆信息 1.1 创建90秒翻滚窗口 …...

图形库篇 | EasyX | 基本介绍

图形库篇 | EasyX | 基本介绍 简介 EasyX 是一个针对 C/C 的图形库&#xff0c;可以帮助 C/C 初学者快速上手图形和游戏编程。 比如&#xff0c;可以基于 EasyX 图形库很快的用几何图形画一个房子&#xff0c;或者一辆移动的小车&#xff0c;可以编写俄罗斯方块、贪吃蛇、黑白…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...