HTTP读书笔记
Web及网络基础
浏览器根据URL从Web服务器端获取文件资源等信息,从而显示出Web页面。
Web使用HTTP超文本传输协议作为规范,完成从客户端到服务器端等一系列运行流程。
WWW这一名称,是Web浏览器当年用来浏览超文本的客户端应用程序时的名称,现在则用来表示这一系列的集合,也可以简称为Web。
HTTP于1990年问世,此时的HTTP并没有作为正式的标准被建立,被称为HTTP/0.9;HTTP在1996年5月正式作为标准公布,版本命名为HTTP/1.0;1997年1月公布的HTTP/1.1是目前主流的HTTP协议版本。
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的,而HTTP属于其内部的一个子集。
TCP/IP协议族
TCP/IP协议族按层次划分为以下四层:
- 应用层:决定了向用户提供应用服务时通信的活动。协议包括FTP、DNS、HTTP。
- 传输层:提供处于网络连接中的两台计算机之间的数据传输。协议包括:TCP、UDP。
- 网络层(网络互连层):处理在网络上流动的数据包,该层规定了通过怎样的传输路线到达对方计算机,并把数据包传送给对方。
- 链路层(数据链路层/网络接口层):处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、网卡,及光纤等物理可见部分。
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接收端则往应用层上走。
HTTP通信流程:
- 作为发送端的客户端在应用层(HTTP协议)发出一共想看某个Web页面的HTTP请求。
- 在传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
- 在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。
- 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。
IP协议
IP(Internet Protocol)网际协议位于网络层,作用是把各种数据包传送给对方。要确保数据包正确传送,需要两个正确条件:IP地址和MAC地址。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址配对,IP地址可变换,但MAC地址基本上不会变更。
IP间的通信依赖MAC地址,通信双方在同一局域网(LAN)的情况很少见,通常是经过多台计算机和网络设备中转才能连接到对方。在进行中转时,会利用下一站中转设备的MAC地址搜索中转目标,此时会采用ARP协议(Address Resolution Protocol),根据通信方的IP地址可以反查出对应的MAC地址。
TCP协议
TCP位于传输层,提供可靠的字节流服务。字节流服务是指,为了方便传输将大块数据分割成以报文段为单位的数据包进行管理。
为了确保数据准确到达目标,TCP采用三次握手策略。握手过程中使用了TCP的标志,SYN和ACK。
- 发送端发送一个带SYN标志的数据包给对方。
- 接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。
- 发送端再回传一个带ACK标志的数据包,代表握手结束。
DNS服务
DNS(Domain Name System)服务是和HTTP一样位于应用层的协议,提供域名到IP地址之间的解析服务。
用户通常使用主机名或域名(如https://www.nowcoder.com/)来访问对方的计算机,而不是直接通过IP地址访问,用字母和数字配合的表示形式来指定计算机名更符合人类的记忆习惯。但计算机很难理解名称,为解决该问题,DNS服务应运而生。
URI和URL
URL(Uniform Resource Location)统一资源定位符,是使用Web浏览器等访问Web页面时需要输入的网页地址。
URI(Uniform Resource Identifier)统一资源标识符,是由某个协议方案标识的资源的定位标识符,协议方案是指访问资源所使用的协议类型名称,例如使用HTTP时协议方案就是http。
URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置),可见URL是URI的子集。
表示指定的URI,要是有涵盖全部必要信息的绝对URI,绝对URL和相对URL。
相对URL,是指从浏览器中基本URI处指定的URL,例如/image/logo.jpg
。
绝对URI,例:http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch=1
。
http
:协议方案名。user:pass
:从服务器端获取资源时的登录信息,是可选项。www.example.jp
:服务器地址,使用绝对URI必须指定服务器地址,地址可以是这种DNS可解析的名称,或192.168.1.1这种IPv4地址,还可以是[0:0:0:0:0:0:0:1]这种用方括号括起来的IPv6地址。80
:服务器连接的网络端口号,可选项。dir/index.htm
:指定服务器上的文件路径来定位特指的资源,与UNIX系统的文件目录结构类似。uid=1
:查询字符串,针对文件路径内的资源可以使用查询字符串传入参数,是可选项。ch=1
:片段标识符,可标记出已获取资源中的子资源,是可选项。
HTTP基础
请求报文和响应报文
HTTP协议用于客户端和服务器之间的通信,请求访问文本或图形等资源的一端被称为客户端,提供资源响应的一端被称为服务器端。
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回,服务器端在没有收到请求前不会发送响应。
例:客户端发送给某个HTTP服务器的请求报文。
GET /index.htm HTTP/1.1
Host: hackr.jp
起始行的GET表示请求访问服务器的类型,称为方法。随后的字符串 /index.htm
指明了请求访问的资源对象,也叫做请求URI。HTTP/1.1
说明了HTTP的版本号。
请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
例:接收到请求的服务器将请求内容的处理结果以响应报文的形式返回。
HTTP/1.1 200 OK
Date: Tue,10 Jul 2020 06:50:12 GMT
Content-Length:352
Content-Type:text/html
<html>
...
起始行的HTTP/1.1
表示服务器的HTTP版本,200和OK表示请求的处理结果对应的状态码和原因短语。下一行显示了创建响应的日期时间等首部字段的属性。接着以一空行分割,之后的内容被称为资源实体。
响应报文由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体构成。
无状态协议
HTTP一种不保存状态的无状态协议,自身不对请求和响应之间的通信状态进行保存,协议对于发送过的请求或响应都不做持久化处理。
使用HTTP协议,每当有新请求发送时,就会有新响应产生。协议本身并不保留之前一切的请求或响应报文信息,这是为了更快地处理大量事务,确保协议的可伸缩性。
随着Web发展,因无状态而导致业务处理更加棘手,例如用户登录购物网站后,需要保存用户的状态。为解决该问题,引入了Cookie技术。
HTTP方法
GET:获取资源。GET方法用来请求访问已被URI识别地资源,指定的资源经服务器端解析后返回响应内容。
POST:传输实体主体。虽然用GET也可以传输实体的主体,但一般使用POST。
PUT:传输文件。PUT方法用来传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。HTTP/1.1的PUT方法不带验证机制,任何人都可以上传文件,存在安全问题,因此一般的Web网站不使用该方法。
HEAD:获得报文首部。HEAD和GET一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新时的日期等。
DELETE:删除文件。DELETE与PUT相反,按请求URI删除指定的资源。HTTP/1.1的DELETE和PUT一样不带验证机制,所以一般的Web网站不使用该方法。
OPTIONS:询问支持的方法。用来查询针对请求URI指定的资源支持的方法。
TRACE:追踪路径。让Web服务器端将之前的请求通信环回给客户端。客户端通过TRACE可以查询发送出的请求是怎样被加工修改/篡改的,因为请求想要连接到源目标服务器可能会通过代理中转,TRACE就是用来确认连接过程中的一系列操作。TRACE不常用,并且容易引发XST(Cross-Site Tracing 跨站追踪)攻击。
CONNECT:要求用隧道协议连接代理。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
持久连接
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况,因为都是容量很小的文本传输所以没有多大问题,但随着HTTP普及,文档中包含大量图片的情况多了起来。因此每次请求都会造成无谓的TCP连接和端口,增加通信开销。
为解决TCP连接问题,HTTP/1.1和部分HTTP/1.0提出了持久连接,其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。HTTP/1.1的所有连接默认都是持久连接,但在HTTP/1.0内未标准化。
持久连接的好处在于减少了TCP连接的重复建立和断开造成的开销,减轻了服务器的负载,提升了Web页面的显示速度。
持久连接使多数请求以管线化方式发送成为可能,从前发送请求后需要等待并受到响应才能发送下一个请求,管线化技术出现后,不用等待响应即可发送下一个请求。这样就能左到并行发送多个请求(和其他书所讲的流水线处理是同一道理)。
Cookie
保留无状态协议特征的同时又要解决其矛盾,于是引入了Cookie技术。Cookie通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据服务器端发送的响应报文内的一个叫做Set-Cookie
的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中假如Cookie值后发送出去。服务器端会根据Cookie检查是哪个客户端发来的连接请求,对比服务器上的记录,得到之前的状态信息。
例:请求报文(无Cookie信息)
GET /reader/ HTTP/1.1
Host: hackr.jp
...
例:响应报文(生成Cookie信息)
HTTP/1.1 200 OK
Date:Thu,12 Jul 2020 08:12:43 GMT
Server:Apache
<Set-Cookie:sid=1645342324465;path=/;...>
...
例:请求报文(有Cookie信息)
GET /reader/ HTTP/1.1
Host: hackr.jp
Cookie:sid=1645342324465
HTTP报文
用于HTTP协议交互的信息被称为HTTP报文,请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块,两者由空行(CR+LF)划分,通常并不一定要有报文主体。
请求报文和响应报文的首部内容由以下数据组成:
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有四种首部,通用首部、请求首部、响应首部、实体首部。
- 其它:可能包含HTTP的RFC里未定义的首部(如Cookie)。
HTTP编码
HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输效率。
报文主体和实体主体的差异:
-
报文是HTTP通信的基本单位,由8位组字节流组成,通过HTTP通信传输。
-
实体作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
-
HTTP报文的主体用于传输请求或响应的实体主体。通常报文主体等于实体主体,只有传输中进行编码操作时,实体主体内容变化,才导致它和报文主体产生差异。
HTTP协议中有一种内容编码功能:指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并解码。
在HTTP通信中,请求的编码实体资源尚未全部传输完成前,浏览器无法显示请求页面,在传输大数据时,通过把数据分割成多块,能让浏览器逐步显示页面,这种吧实体主体分块的功能成为分块传输编码。
分块传输编码会将实体主体分成多个部分(块),每块都会用16进制标记其大小,而实体主体的最后一块会使用”0“来标记。
多部分对象集合
HTTP协议中采纳了多部分对象集合,来容纳多份不同类型的数据。发送的一份报文主体可含有多类型实体,通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下:
-
multipart/form-data:在Web表单文件上传时使用。
-
multipart/byteranges:状态码206响应报文包含了多个范围的内容时使用。
如果下载过程中遇到网络中断的问题必须从头开始,为了解决该问题需要一种可恢复的机制,所谓恢复是指能从之前下载中断处恢复下载。要实现该功能需要指定下载的实体范围,指定范围发送的请求叫做范围请求。
对一份10000字节大小的资源,如果使用范围请求,可以只请求5001-10000字节内的资源。执行范围请求时,会用到首部字段Range来指定资源的byte范围,byte范围的指定形式如下:
Range: bytes=5001-10000
针对范围请求,响应会返回状态码206的响应报文,如果服务器无法响应范围请求,会返回状态码200 OK和完整的实体内容。
返回合适内容
同一个Web网站可能存在多份相同内容的页面,例如中文版和英文版,当浏览器的默认语言为英语或中文时,访问相同URI的Web页面时,就会显示对应的英文版或中文版的Web页面,该机制称为内容协商。
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断依据。
内容协商包括以下类型:
- 服务器驱动协商:由服务器端进行内容协商,以请求的首部字段为参考,在服务器端自动处理。
- 客户端驱动协商:由客户端进行内容协商,用户从浏览器显示的可选项列表中手动选择。
- 透明协商:由服务器端和客户端各自进行内容协商。
HTTP状态码
借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
类别 | 原因短语 | |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理请求 |
5XX | 服务器端错误状态码 | 服务器处理请求出错 |
具有代表性的14个常用状态码如下:
- 200 OK:表示客户端发来的请求在服务器端被正常处理了。
- 204 No Content:表示服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分,另外也不允许返回任何实体的主体。
- 206 Partial Content:表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。
- 301 Moved Permanently:永久性重定向,表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。
- 302 Found:临时性重定向,表示请求的资源已经被分配了新的URI,希望用户(本次)使用资源现在所指的URI。
- 303 See Other:表示由于请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源。
- 304 Not Modified:表示客户端发送附带条件的请求时,服务器允许请求访问资源,但因为发生请求未满足条件的情况后,直接返回304(服务器端资源未改变,可直接使用客户端未过期的缓存)。
- 307 Temporary Redirect:临时重定向,和302有相同含义。
- 400 Bad Request:表示请求报文中存在语法错误。
- 401 Unauthorized:表示发送的请求需要有通过HTTP认证的认证信息。
- 403 Forbidden:表示对请求资源的访问被服务器拒绝了,服务器端没必要给出拒绝的详细理由,如果想说明的话可以在实体的主体部分描述。
- 404 Not Found:表示服务器上无法找到请求的资源,也可以在服务器拒绝请求且不想说明理由时使用。
- 500 Internal Server Error:表示服务器端在执行请求时发生了错误,也有可能是Web应用存在的bug或某些临时的故障。
- 503 Service Unavailable:表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
不少返回的状态码响应都是错误的,比如Web应用程序发送内部错误时,状态码依旧返回200 OK,这种情况也经常遇到。
Web服务器
虚拟主机
HTTP/1.1允许一台HTTP服务器搭建多个Web站点。比如提供Web托管服务的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站,这利用率虚拟主机的功能。即使物理层面只有一台主机,但只要使用虚拟主机的功能,就可以模拟多台服务器。
客户端使用HTTP协议访问服务器时,经常采用类似www.nowcoder.com这样的主机名和域名。域名通过DNS映射到IP地址,当请求发送到服务器时,已经是以IP地址的形式访问了。如果一台服务器托管了www.nowcoder.com和www.qq.com两个域名,收到请求时就需要弄清究竟要访问哪个域名。
在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。
通信数据转发程序
HTTP通信时,除了客户端和服务器外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。
代理是一种有转发功能的应用程序,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
- 代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。
- 代理不改变请求URI,会直接发送给前方持有资源的目标服务器。
- 使用代理服务器的理由是:利用缓存技术减少网络流量,组织内部针对特定网站的访问控制等。
网关是转发其他服务器通信数据的服务器,接收从客户端发来的请求时,它就像自己拥有资源的服务器一样对请求进行处理。
- 利用网关可以提高通信安全性,因为可以在客户端与网关之间的通信线路上加密。
- 网关可以提供非HTTP服务,比如网关可以连接数据库,使用SQL语句查询数据。
隧道是在相隔甚远的客户端和服务器两者间进行中转,并保持双方通信连接的应用程序。
- 隧道可按要求建立通信线路,使用SSL等加密手段进行通信,目的是确保通信安全。
- 隧道本身不会解析HTTP请求,请求保持原样中转给之后的服务器,隧道会在通信双方断开连接时结束。
缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可以减少对源服务器的访问,节省通信资源。缓存服务器是代理服务器的一种,并归类在缓存代理类型中。当代理转发从服务器返回的响应时,代理服务器会保存一份资源的副本。
缓存服务器的优势在于利用缓存可编码多次从源服务器转发资源,因此客户端可以就近从缓存服务器上获取资源。
当遇到源服务器资源更新时,缓存就会失效。如果判断缓存失效,缓存服务器就会再次从源服务器上获取新资源。
缓存不仅可以存在于缓存服务器,还可以存在与客户端浏览器中。以IE浏览器为例,把客户端缓存称为临时网络文件。浏览器缓存如果有效,就不必再向服务器请求相同的资源,可以直接从本地磁盘内读取。若判断浏览器缓存失效,浏览器会再次请求新资源。
HTTP首部
在报文众多字段中,HTTP首部字段包含的信息最丰富。首部字段同时存在于请求和响应报文,并涵盖HTTP报文的相关内容信息。使用首部字段是为了给浏览器和服务器提供报文主体大小、所用语言、认证信息等内容。
HTTP首部字段是由首部字段名和字段值构成的,中间用冒号":"分隔,例如:
Content-Type: text/html
以上述示例,首部字段名是Content-Type
,字符串text/html
是字段值。
HTTP首部根据实际用途分为四种类型:
- 通用首部字段,请求和响应报文都会使用的首部。
- 请求首部字段,请求报文使用的首部。
- 响应首部字段,响应报文使用的首部。
- 实体首部字段,针对请求和响应报文的实体部分使用的首部。
HTTP/1.1通用首部字段
- Cache-Control:操作缓存的工作机制。
- Connection:控制不再转发给代理的首部字段、管理持久连接。
- Date:表明创建HTTP报文的日期和时间。
- Pragma:是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。
- Trailer:说明报文主体后记录了哪些首部字段。
- Transfer-Encoding:规定了传输报文主体时采用的编码方式。
- Upgrade:用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信。
- Via:追踪客户端与服务器之间的请求和响应报文的传输路径。
- Warning:从HTTP/1.0的响应首部Retry-After演变而来,会告知用户一些与缓存相关的问题警告。
请求首部字段
Accept:可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
- 文本文件:text/html、text/css、application/xml…
- 图片文件:image/jpeg、image/gif、image/png…
- 视频文件:video/mepg、video/quicktime…
Accept-Charset:通知服务器用户代理支持的字符集及字符串的相对优先顺序。
Accept-Encoding:通知服务器用户代理支持的内容编码及其优先级。
- gzip:由文件压缩程序gzip生成的编码格式,采用LZ77及CRC算法。
- compress:由UNIX文件压缩程序compress生产的编码格式,采用LZW算法。
- deflate:组合使用zilb格式及deflate算法生成的编码格式。
- identify:不执行压缩或不会变化的默认编码格式。
Accept-Language:告知服务器用户代理能够处理的自然语言集以及其优先级。
Authorization:告知服务器,用户代理的认证信息。
Expect:告知服务器,用户代理期望出现的某种特定行为。
Form:告知服务器用户代理的用户的电子游戏地址。
Host:告知服务器,请求的资源所处的互联网主机名和端口号,是必须存在的。
User-Agent:将创建请求的浏览器类型和用户代理名称等信息传达给服务器。
响应首部字段
Accept-Ranges:用来告知客户端,服务器是否能处理范围请求。
Age:告知客户端,源服务器在多久前创建了响应,单位秒。
ETag:告知客户端实体标识,是一种可以将资源以字符串形式作唯一性标识的方式,服务器会为每份资源分配对应的ETag值。
Location:可以将响应接收方引导至某个与请求URI位置不同的资源,会配合3xx的响应,提供重定向URI。
Proxy-Authenticate:会把代理服务器所要求的认证信息发送给客户端。
Retry-After:告知客户端应该在多久后再次发送请求,主要配合状态码503或3xx使用。
Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary:对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
实体首部字段
Allow:用于通知客户端能够支持请求资源的所有HTTP方法,如果服务器接收到不支持的HTTP方法会返回405,还会把所有支持的方法写入Allow。
Content-Encoding:告知客户端,服务器对实体的主体部分选用的内容编码方式。
Content-Language:告知客户端,实体主体使用的自然语言。
Content-Language:表明了实体主体部分的大小,单位字节。
Content-Location:给出与报文主体部分相对应的URI。
Content-MD5:一串由MD5算法生成的值,目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Range:针对范围请求,告知客户端作为响应返回实体的哪个部分符合范围请求。
Content-Type:说明了实体主体内对象的媒体类型。
Last-Modified:指明资源最终修改的时间。
Cookie首部字段
Set-Cookie:开始状态管理所使用的Cookie信息。
- NAME=VALUE:Cookie的名称和值。
- expires=DATE:Cookie的有效期。
- path=PATH:将服务器上的文件目录作为Cookie的适用对象。
- domain=域名:作为Cookie的适用对象的的域名。
- Secure:仅在HTTPS时才使用。
- HttpOnly:使Cookie不能被JavaScript脚本访问。
Cookie:服务器接收到的Cookie信息。
HTTPS
HTTP的不足
通信使用明文(不加密),内容可能会被窃听。
- 通信的加密:可以通过和SSL或TLS的组合使用,加密HTTP的通信内容。
- 内容的加密:对HTTP报文里所含的内容进行加密,前提是客户端和服务器同时具备加密和解密机制。
不验证通信方的身份,因为可能遭遇伪装。
- 使用SSL可以确认通信方,SSL使用了一种被称为证书的手段,可用于确定方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说异常困难。
无法证明报文完整性,有可能被篡改。
- 常用MD5和SHA-1等散列值校验的方法,以及数字签名确认报文完整性。
HTTPS
添加了加密及认证机制的HTTP就称为HTTPS,使用HTTPS时不再用http://
而是改用https://
。
HTTPS不是应用层的一种新协议,只是HTTP通信接口部分使用SSL和TLS协议代替而已。HTTPS就是身披SSL协议外壳的HTTP,采用SSL后,HTTP就拥有了HTTPS的加密、认证和完整性保护这些功能。
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制,在交换密钥环节使用公开密钥加密保证安全性,之后建立通信交换报文阶段则使用共享密钥加密方式保证效率。
HTTPS的通信步骤:
- 客户端发送Client Hello报文开始SSL通信,报文中包含客户端支持的SSL的指定版本、加密组件列表。
- 服务器可进行SSL通信时,会以Server Hello报文进行应答,报文包含SSL版本以及加密组件。
- 服务器发送Certificate报文,报文包含公开密钥证书。
- 服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
- SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应,报文中包含通信加密中使用的一种随机密码串。
- 客户端继续发送Change Cipher Spec报文,提示服务器,在此报文后的通信会采用随机密码串加密。
- 客户端发送Finished报文,包含连接至今全部报文的整体校验值。
- 服务器同样发送Change Cipher Spec报文。
- 服务器同样发送Finished报文。
- 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。通信会收到SSL保护。
- 应用层协议通信,即发送HTTP响应。
- 客户端断开连接,断开连接时发送close_notify报文。
在以上流程中,应用层发送数据时会附加一种叫做MAC(Message Authentication Code)的报文摘要。MAC能够查知报文是否遭到篡改,保护报文完整性。
既然HTTPS那么安全可靠,为什么所有Web网站不一直使用HTTPS?原因:与纯文本通信相比,加密通信会消耗更多的CPU及内存资源,如果每次通信都加密,会消耗相当多的资源,平摊到每一台计算机上时,能够处理请求数量必定也会随之减少。因此如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。
Web攻击技术
针对Web的攻击技术
简单的HTTP协议本身并不存在安全问题,因此协议本身几乎不会成为攻击对象。应用HTTP协议的服务器、客户端以及运行在服务器上的Web应用等资源才是攻击目标。
在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击。通过URL查询字段或表单、HTTP首部、Cookie等途径把攻击代码传入,若这时Web应用存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
针对Web应用的攻击模式有以下两种:
- 以服务器为目标的主动攻击:主动攻击是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。主动攻击模式里具有代表性的是SQL注入和OS命令注入攻击。
- 以服务器为目标的被动攻击:被动攻击是指利用全套策略执行攻击代码的攻击模式,攻击者不直接对目标Web应用访问发起攻击。被动攻击通常的攻击模式如下:①攻击者诱使用户触发设置好的陷阱,陷阱会启动发送嵌入攻击代码的HTTP请求。②用户不知不觉中招后,用户的浏览器或邮件客户端会触发陷阱。③中招后的用户浏览器把含有攻击代码的HTTP请求发送给作为攻击目标的Web应用,运行攻击代码。④执行完攻击代码,存在安全漏洞的Web应用会成为攻击者的跳板,可能导致用户Cookie等个人信息被窃取,登陆状态中的用户权限遭恶意滥用等后果。被动攻击模式中具有代表性的是跨站脚本攻击和跨站点请求伪造。
因输出值转义不完全引发的安全漏洞
从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,针对输出值做转义处理是一项至关重要的安全策略。因为当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。
跨站脚本攻击(XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击,有可能造成以下影响:利用虚假输入表单骗取用户个人信息、显示伪造的文章或图片。
SQL注入是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。该安全隐患有可能引发极大的威胁,有时会直接导致个人信息及机密信息泄露。SQL注入可能会造成以下影响:非法查看或篡改数据库数据、规避认证、执行和数据库服务器业务关联的程序等。
OS命令注入攻击是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。OS命令注入可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。
HTTP首部注入攻击是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。HTTP首部注入可能造成以下影响:设置任何Cookie信息、重定向至任意URL、显示任意的主体。
邮件首部注入攻击是指Web应用中邮件发送功能,攻击者通过向邮件首部To或Subject内任意添加非法内容发起的攻击。利用存在安全漏洞的Web网站,可对任意邮件地址发送广告邮件或病毒邮件。
因设置或设计缺陷引发的安全漏洞
强制浏览:从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。可能有以下影响:泄露顾客的个人信息等重要情报、泄露原本需要具有访问权限的用户才可查阅的信息、泄露未连接到外界的文件。
不正确的错误消息处理:Web应用的错误信息内包含对攻击者有用的信息,与Web应用有关的主要错误信息包括Web应用抛出的错误信息、数据库等系统抛出的错误信息。
开放重定向:一种对指定的任意URL做重定向的跳转功能,假如指定的重定向URL到某个恶意网站,那么用户就会被诱导至那个网站。
因会话管理疏忽引发的安全漏洞
会话管理是用来管理用户状态的必备功能,但如果在管理上有所疏忽,会导致用户的认证状态被窃取等后果。
会话劫持:攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。获得会话ID的途径包括:通过非正规的生成方法推测会话ID、通过窃听或XSS攻击盗取会话ID、通过会话固定攻击强行获取会话ID。
跨站点请求伪造(CSRF):攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。可能会造成以下影响:利用已通过认证的用户权限更新设定信息、利用已通过认证的用户权限购买商品、利用已通过认证的用户权限在留言板发表评论。
其它安全漏洞
密码破解攻击即算出密码,突破认证。攻击不仅限于Web应用,还包括其它系统(如FTP或SSH等)。密码破解有以下两种手段:
- 通过网络的密码试错。
- 穷举法:又称暴力破解法,对所有密钥集合构成的密钥空间进行穷举。
- 字典攻击:利用事先收集好的候选密码(经过各种组合后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法。与穷举法相比耗时短,但如果字典中没有正确的密码就无法破解成功。
- 对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)。
- 通过穷举法、字典攻击进行类推:尝试调用相同的散列函数加密候选密码,然后把计算出的散列值与目标散列值匹配,类推出密码。
- 彩虹表:由明文密码以及与之对应的散列值构成的一张数据库表,是一种通过事先制作庞大的彩虹表,可在穷举法、字典攻击等实际破解过程中缩短消耗时间的技巧。
- 拿到密钥。
- 利用加密算法的漏洞。
点击劫持是指利用透明的按钮或链接做成陷阱,覆盖在Web页面之上,然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段,这种行为又称为界面伪装。已设置陷阱的Web页面,表面上并无不妥,但早已迈入想让用户点击的链接,当用户点击到透明按钮时,实际上点击了已指定透明元素属性的iframe页面。
Dos攻击是一种让运行中的服务呈停止状态的攻击,也叫做服务停止攻击或拒绝服务攻击。Dos的攻击对象不仅包括Web网站,还包括网络设备及服务器等。主要有以下两种Dos攻击方式:集中利用访问请求造成资源过载,资源用尽的同时,服务也就呈停止状态;通过攻击安全漏洞使服务停止。
后门程序是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限的功能,包括:①开发阶段作为Debug调用的后门程序。②开发者为了自身利益植入的后门程序。③攻击者通过某种方法设置的后门程序。可通过监视进程和通信的状态发现被植入的后门程序,但设定在Web应用中的后门程序由于和正常使用时区别不大,通常很难发现。