图解HTTP
Ⅰ 概述
1、HTTP概念
- Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议 )的协议作为规范,完成从客户端到服务器端等一系列运作流程。Web是建立在HTTP协议上通信的
- 现在主要是
HTTP/1.0
和HTTP/1.1
两个版本
2、TCP/IP简介
- TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层(分层是为了解耦,便于维护)
3、TCP/IP通信传输
4、IP、TCP、DNS
IP协议位于网络层,IP 间的通信依赖 MAC 地址。在网络上,通信的双方在同一局域网
(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的 MAC地址来搜索下一个中转目标。这时,会采用 ARP 协议(Address Resolution Protocol)。ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。ARP协议是网络层协议,属于TCP/IP协议-
DNS协议用于域名解析,将域名转化为ip地址。属于应用层协议
image-20201226135745151image-20201226140111330 TCP协议位于运输层,提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。
-
TCP的“三握四挥”(后面详细讲)
image-20201226140026955
5、各种协议与HTTP协议的关系
6、URI与URL
- URI:统一资源标识符
- URL:统一资源定位符(如https://www.baidu.com)
- 两者对比:URI相当于是一个接口,它表示可以唯一的标识出这个资源;而URL相当于是接口的实现类,给出了唯一标识这个资源的一种具体方法,当然可能不仅仅只有这一种方法
Ⅱ 简单的HTTP协议
1、通过请求和响应的交换达成通信
-
请求(Request):请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成
image-20201226141818413 -
响应(Response):响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
image-20201226141946776
2、HTTP是不保存状态的协议
为什么不保存状态?这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
那如何保存状态?使用Cookie。Cookie 技术通过在请求和响应报文中写入 Cookie 信
息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
3、告知服务器意图的HTTP方法(请求方法)
-
GET:用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果
image-20201226142818094 -
POST:用来传输实体的主体。POST 的主要目的并不是获取响应的主体内容。
image-20201226142831084 PUT:传输文件。鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类Web 网站,就可能会开放使用 PUT 方法。
HEAD:获得报文的首部。HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。
-
······
image-20201226143119930
4、HTTP的持久连接来节省通信量
HTTP的初始版本,每进行一次HTTP通信就要断开一次TCP连接。比如,使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断
开,增加通信量的开销。
为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
管线化技术能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
Ⅲ HTTP报文
HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。HTTP 报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
1、请求报文与响应报文的结构
实例如下:
- 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本。
- 状态行:包含表明响应结果的状态码,原因短语和 HTTP 版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。
- 其他:可能包含HTTP 的 RFC 里未定义的首部(Cookie 等)。
2、编码提升传输速率
HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。
3、获取部分内容的范围请求
像这样,指定范围发送的请求叫做范围请求(Range Request)。对一份 10 000 字节大小的资源,如果使用范围请求,可以只请求5001~10 000 字节内的资源。
4、内容协商返回最合适的内容
同一个 Web 网站有可能存在着多份相同内容的页面。比如英语版和中文版的 Web 页面,它们内容上虽相同,但使用的语言却不同。当浏览器的默认语言为英语或中文,访问相同 URI 的 Web 页面时,则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协商(Content Negotiation)。
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
内容协商的类型:
- 服务器驱动协商:以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。
- 客户端驱动协商:用户从浏览器显示的可选项列表中手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选择
- 透明协商:是由服务器端和客户端各自进行内容协商的一种方法。
Ⅳ HTTP状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。状态码的类别:
1、2XX
成功
- 200 OK:表示从客户端发送的请求被服务器正常处理了
- 204 No Content:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中
不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。 - 206 Partial Content:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
2、3XX
重定向
301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
302 Found:临时重定向。和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。
-
303 See Other:该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET
方法定向获取请求的资源。303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使
用时大家都会这么做。 304 Not Modified:该状态码表示客户端发送附带条件的请求(指采用 GET 方法的请求报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部)时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
307 Temporary Redirect:临时重定向,与302 Found 状态码有着相同含义。307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。
3、4XX
客户端错误
400 Bad Request:该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求
的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。-
401 Unauthorized:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、
DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用 户认证失败。返回含有 401 的响应必须包含一个适用于被请求资源的 WWWAuthenticate首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。image-20201226155457095 403 Forbidden:该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要
给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。404 Not Found:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
4、5XX
服务器错误
- 500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。
- 503 Service Unavailable:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入RetryAfter 首部字段再返回给客户端。
Ⅴ 通信数据转发程序:代理、网关、隧道&&保存资源的缓存
- 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
- 网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
- 隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
1、代理
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。
- 缓存代理:代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
- 透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
2、网关
利用网关可以由 HTTP 请求转化为其他协议通信。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用 SQL 语句查询数据。
3、隧道
隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
4、保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
- 缓存的有效期限
- 客户端的缓存:缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。
Ⅵ HTTP首部
Ⅶ 确保Web安全的HTTPS
在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用HTTPS 通信机制可以有效地防止这些问题。
1、HTTP的缺点
- 通信使用明文,内容可能被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法验证明报文的完整性,有可能遭到篡改
① 通信使用明文,内容可能被窃听
TCP/IP是可能被窃听的网络。即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到的。
-
加密处理防止被窃听
- 通信的加密:HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容。用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP通信了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 HTTP over SSL。
- 内容的加密:通信本身不加密,但是通信内容加密
② 不验证通信方的身份,因此有可能遭遇伪装
-
任何人都可以发起请求。在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的 IP 地址和端口号没有被 Web 服务器设定限制访问的前提下)。
- 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器。
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具备访问权限。
- 无法判定请求是来自何方、出自谁手。
- 即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)。
-
查明对手的证书
虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL 则可以。SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说是异常困难的一件事。所以只要能够确认通信方(服务器或客户端)持有的证书,即可判断通信方的真实意图。
③ 无法证明报文的完整性,可能遭篡改
- 接收到的内容可能有误:比如,从某个 Web 网站上下载内容,是无法确定客户端下载的
文件和服务器上存放的文件是否前后一致的。文件内容在传输途中可能已经被篡改为其他的内容。即使内容真的已改变,作为接收方的客户端也是觉察不到的。像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack,MITM)。 - 防止篡改:SSL 提供认证和加密处理及摘要功能。
2、HTTP+加密+认证(证书)+完整性保护=HTTPS
HTTPS是身披SSL外壳的HTTP。HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。在采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护这些功能。SSL 是独立于 HTTP 的协议,所以不光是 HTTP 协议,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL 协议使用。可以说 SSL 是当今世界上应用最为广泛的网络安全技术。
3、相互交换密钥的公开密钥加密技术
-
共享密钥加密的困境。加密和解密同用一个密钥,也被叫做对称密钥加密。
image-20201226171540765 -
使用两把公开密钥加密:
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥(private key),另一把叫做公开密钥(public key)。
image-20201226171846149 -
HTTPS采用混合加密机制
在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
image-20201226172044584
4、证明公开密钥正确性的证书
公开密钥加密方式还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥。可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
-
可证明组织真实性的EV SSL证书
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。拥有该特性的证书就是 EV SSL 证书(Extended Validation SSL Certificate)。
用以确认客户端的客户端证书
······
5、HTTPS的安全通信机制
-
SSL和TLS
HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security)这两个协议。TSL 是以 SSL 为原型开发的协议,有时会统一称该协议为 SSL。当前主流的版本是 SSL3.0 和 TLS1.0。
-
SSL的速度
HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。
image-20201226190721173
Ⅷ 用户身份的认证
认证需要核对信息:
- 密码:只有本人才会知道的字符串信息。
- 动态令牌:仅限本人持有的设备内显示的一次性密码。
- 数字证书:仅限本人(终端)持有的信息。
- 生物认证
- IC卡
HTTP/1.1采用的认证方式:
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单的认证)
1、BASIC认证
由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。另外,除此之外想再进行一次 BASIC 认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一。
2、DIGEST认证
DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
3、SSL客户端认证
SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书(在 HTTPS 一章已讲解)认证,服务器可确认访问是否来自已登录的客户端。
-
SSL客户端认证采用双因素认证
在多数情况下,SSL 客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证(Two-factorauthentication)来使用。所谓双因素认证就是指,认证过程中不仅需要密码这一个因素,还需要申请认证者提供其他持有信息,从而作为另一个因素,与其组合使用的认证方式。换言之,第一个认证因素的 SSL 客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。
4、基于表单认证
多数情况下,输入已事先登录的用户 ID(通常是任意字符串或邮件地址)和密码等登录信息后,发送给 Web 应用程序,基于认证结果来决定认证是否成功。
补充:一种安全的保存方法是,先利用给密码加盐(其实就是由服务器随机生成的一个字符串,但是要保证长度足够长,并且是真正随机生成的。然后把它和密码字符串相连接(前后都可以)生成散列值。当两个用户使用了同一个密码时,由于随机生成的 salt 值不同,对应的散列值也将是不同的。)的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。
Ⅸ HTTP/2.0
Ⅹ Web的攻击技术
1、针对Web应用的攻击模式
-
主动攻击
以服务器为目标的主动攻击:主动攻击模式里具有代表性的攻击是 SQL 注入攻击和 OS 命令注入攻击。
-
被动攻击
-
以服务器为目标的被动攻击:被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。
image-20201227102654932 -
利用用户的身份攻击企业内部网络
image-20201227102820399
-