计算机网络和HTTP协议:HTTP篇

一、简单的HTTP协议

(一) HTTP 特点

  1. 无状态:HTTP 协议自身不具备保存之前发送过的请求或响应的功能,有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
  2. 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
  3. 基于请求和响应:在两台计算机之间使用 HTTP 协议通信时,在一条通信线路上必定有一端是客户端,另一端则是服务器端。请求必定由客户端发出,而服务器端回复响应,服务器端在没有接收到请求之前不会发送响应。
  4. 简单快速、灵活
  5. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

(二) 告知服务器意图的 HTTP 方法

二、HTTP 报文内的 HTTP 信息

HTTP 报文大致可分为报文首部和报文主体两块。两者由最初出现的 空行(CR+LF)来划分。通常,并不一定要有报文主体。

(一) 请求报文

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。

(二) 响应报文

响应报文由协议版本、状态码、原因短语、可选的响应首部字段以及实体主体构成。

(三) 编码提升传输速率

  1. HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量 的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。

  2. 压缩传输的内容编码:

    内容编码指明用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常用的内容编码有以下几种:gzip(GNU zip),compress(UNIX 系统的标准压缩),deflate(zlib),identity(不进行编码)。

  3. 分割发送的分块传输编码:

    在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成 多块,能够让浏览器逐步显示页面。

(四) 发送多种数据的多部分对象集合

  1. HTTP 协议中采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
  2. 多部分对象集合包含的对象如下:
  • multipart/form-data:在 Web 表单文件上传时使用。
  • multipart/byteranges:状态码 206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
  1. 在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上Content-type。

(五) 获取部分内容的范围请求

  1. 所谓恢复是指能从之前下载中断处恢复下载,要实现该功能需要指定下载的实体范围。指定范围发送的请求叫做范围请求(Range Request)。
  2. 执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围。
  3. 针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。另外,对于多重范围的范围请求,响应会在首部字段 Content- Type 标明 multipart/byteranges 后返回响应报文。
  4. 如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容。

(六) 内容协商返回最合适的内容

  1. 当浏览器的默认语言为英语或中文,访问相同 URI 的 Web 页面时,则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协商(Content Negotiation)。
  2. 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。
  3. 内容协商技术有以下 3 种类型。
  • 服务器驱动协商:由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。
  • 客户端驱动协商:由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或手机版页面。
  • 透明协商:是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

三、HTTP 状态码

转载自精读《图解HTTP》:https://juejin.im/post/5b32f82a518825749e4a218b

四、与 HTTP 协作的 Web 服务器

(一) 用单台虚拟主机实现多个域名

HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点,即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以 假想已具有多台服务器。

(二) 通信数据转发程序 :代理、网关、隧道

  1. 代理:代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
  2. 网关:网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
  3. 隧道:隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。

(三) 保存资源的缓存

  1. 缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
  2. 即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器或浏览器将会再次从源服务器上获取“新”资源。

五、HTTP 首部

HTTP 首部字段根据实际用途被分为以下 4 种类型。

  1. 通用首部字段:请求报文和响应报文两方都会使用的首部。
  2. 请求首部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
  3. 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  4. 实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

(一) HTTP 首部

(二) 非 HTTP/1.1 首部字段

在 HTTP 协议通信交互中使用到的首部字段,不限于 RFC2616 中定 义的 47 种首部字段。还有 Cookie、Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段,它们的使用频率也很高。 这些非正式的首部字段统一归纳在 RFC4229 HTTP Header Field Registrations 中。

(三) End-to-end 首部和 Hop-by-hop 首部

  1. 端到端首部(End-to-end Header):分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

  2. 逐跳首部(Hop-by-hop Header):分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。

  3. 除这 8 个首部字段之外, 其他所有字段都属于端到端首部。

    Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer,TE,Transfer-Encoding,Upgrade

(四) 为 Cookie 服务的首部字段

  1. HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
  2. Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。
  3. 当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
  4. 服务器端发现客户端发送过来的 Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

六、确保 Web 安全的 HTTPS

(一) HTTP 的缺点

  1. HTTP 报文使用明文(不加密),内容可能会被窃听。
  2. HTTP 协议中的请求和响应不会对通信方进行确认,不验证“服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的 返回到实际提出请求的客户端”,有可能遭遇伪装。
  3. HTTP 协议无法证明通信的报文完整性,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。换句话说,没有任何办法确认,发出的请求 / 响应和接收到的请求 / 响应是前后相同的。

(二) HTTPS = HTTP+ 加密 + 认证 + 完整性保护

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

七、确认访问用户身份的认证

判断访问服务器的使用者的身份。

(一) BASIC 认证(基本认证)

使用用户的 ID/密码作为凭证信息,并且使用 base64 算法进行编码。

(二) DIGEST 认证(摘要认证)

服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。

(三) SSL 客户端认证

SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否 来自已登录的客户端。

(四) FormBase 认证(基于表单认证)

客户端会向服务 器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证。

八、基于 HTTP 的功能追加协议

(一) SPDY

  1. 多路复用流

    通过单一的 TCP 连接,可以无限制处理多个 HTTP 请求。所有请求的处理都在一条 TCP 连接上完成,因此 TCP 的处理效率得到提高。

  2. 赋予请求优先级

    SPDY 不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响 应变慢的问题。

  3. 压缩 HTTP 首部

    压缩 HTTP 请求和响应的首部。这样一来,通信产生的数据包数量和 发送的字节数就更少了。

  4. 推送功能

    支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送 数据,而不必等待客户端的请求。

  5. 服务器提示功能

    服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。

  6. 只是将单个域名( IP 地址)的通信多路复用,所以当一个 Web 网站上使用多个域名下的资源,改善效果就会受到限制。

(二) WebSocket

  1. 推送功能

    支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发 送数据,而不必等待客户端的请求。

  2. 减少通信量

    只要建立起 WebSocket 连接,就希望一直保持连接状态。和 HTTP 相比,不但每次连接时的总开销减少,而且由于 WebSocket 的首部信息 很小,通信量也相应减少了。

(三) HTTP/2.0

  1. 二进制分帧:将所有传输信息分割为更小的消息和帧,并对它们采用二进制格式的编码将其封装。
  2. 首部压缩:首部表来跟踪和存储之前发送的键值对。
  3. 流量控制:HTTP 2.0 利用流来实现多路复用,这引入了对TCP连接的使用争夺,会造成流被阻塞。流量控制方案确保在同一连接上的多个流之间不会造成破坏性的干扰。流量控制会用于各个独立的流,也会用于整个连接。
  4. 多路复用:允许通过单一的HTTP 2.0连接发起多重的请求-相应消息。
  5. 请求优先级:优先值确定着客户端跟服务器处理不同的流采取不同的优先级策略,高优先级优先发送。
  6. 服务器推送:服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。

(四) WebDAV

WebDAV是一个可对 Web 服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能。

九、Web 的攻击技术

(一) 因输出值转义不完全引发的安全漏洞

1. 跨站脚本攻击

跨站脚本攻击(Cross-Site Scripting,XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

  1. 对输入和URL参数进行过滤,将容易导致XSS攻击的边角字符替换成全角字符。

  2. 对输出进行编码,对所有要动态输出到页面的内容,通通进行相关的编码和转义。

2. 跨站脚本攻击

SQL 注入(SQL Injection)是指针对 Web 应用使用的数据库,通 过运行非法的 SQL 而产生的攻击。该安全隐患有可能引发极大 的威胁,有时会直接导致个人信息及机密信息的泄露。

3. 跨站脚本攻击

OS 命令注入攻击(OS Command Injection)是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。

4. 跨站脚本攻击

HTTP 首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。

5. 跨站脚本攻击

目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录, 通过非法截断其目录路径后,达成访问目的的一种攻击。

6. 跨站脚本攻击

远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要 从其他文件读入时,攻击者利用指定外部服务器的 URL 充当依赖文 件,让脚本读取之后,就可运行任意脚本的一种攻击。

(二) 因设置或设计上的缺陷引发的安全漏洞

1. 强制浏览

强制浏览(Forced Browsing)安全漏洞是指,从安置在 Web 服务器 的公开目录下的文件中,浏览那些原本非自愿公开的文件。

2. 不正确的错误消息处理

不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web 应用的错误信息内包含对攻击者有用的信息。

3. 开放重定向

开放重定向(Open Redirect)是一种对指定的任意 URL 作重定向跳转的功能。

(三) 因会话管理疏忽引发的安全漏洞

1. 会话劫持

会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会 话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。

2. 会话固定攻击

会话固定攻击(Session Fixation)会强制用户使用攻击者指定的会话 ID。

3. 跨站点请求伪造

跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信 息或设定信息等某些状态更新。

  1. 客户端防范:对于数据库的修改请求,全部使用POST提交,禁止使用GET请求。
  2. 服务器端防范:一般的做法是在表单里面添加一段隐藏的唯一的token(请求令牌)。

(四) 其他安全漏洞

1. 密码破解

密码破解攻击(Password Cracking)即算出密码,突破认证。

2. 点击劫持

点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击那个链接 访问内容的一种攻击手段。

3. DoS 攻击

DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。

4. 后门程序

后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使 用受限功能。利用后门程序就能够使用原本受限制的功能。

转载于:https://juejin.im/post/5d009cf46fb9a07ecc447dae

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值