My Github

《图解HTTP》读书笔记

   

  目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HTTP协议并不复杂,理解起来也不会花费太多学习成本,这本书的出现就及时缓解了该问题。对基础及核心部分的深入学习是成为一名专业技术人员的前提,以不变应万变才是立足之本。此外,这本书也是我的2016年度读书计划中的一本,它和《图解TCP/IP》一起作为计算机网络基础部分为我温故知新了一把,谢谢作者和译者,画了这么多图解让我们理解。

一、HTTP协议初探

  1.1 各种协议与HTTP协议的关系

  1.2 请求处理响应模型

  HTTP协议规定,请求从客户端发出,最后服务端响应应该请求并返回。

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

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

  

  1.3 HTTP是一种无状态协议

  HTTP协议对于发送过的请求或响应都不做持久化处理:协议本身并不保留之前一切的请求或响应报文的信息,这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

  Cookie根据服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端自动在请求报文中加入Cookie值后发送出去。服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

  1.4 告知服务器意图的HTTP方法

  (1)GET:获取资源

  (2)POST:传输实体主体 → POST的主要目的并不是获取响应的主体内容

  (3)PUT:传输文件 → 就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置

但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,所以存在安全性问题,因此一般的Web网站不使用该方法

  (4)HEAD:获得报文首部 → HEAD与GET一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等等。

  (5)DELETE:删除文件 → DELETE与PUT相反,DELETE按请求URI删除指定资源。

但是,HTTP/1.1的DELETE方法本身与PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。  

  (6)OPTIONS:询问支持的方法 → 查询针对请求URI指定的资源所支持的方法(例如该资源支持GET、POST、PUT等)。

  (7)TRACE:追踪路径 → 让Web服务器端将之前的请求通信环回给客户端的方法。(不常用,容易引发XST攻击)

  (8)CONNECT:要求用隧道协议连接代理 → 要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经过网络隧道传输。

CONNECT方法的格式:CONNECT 代理服务器名:端口号 HTTP版本

  1.5 持久连接

  在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。因此,每次的请求都会造成无谓的TCP连接建立与断开,增加通信量的开销。为了解决这个问题,HTTP/1.1想出了持久连接(也称为HTTP keep-alive),其特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。

持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载,也使得HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应的提高了。在HTTP/1.1中,所有的连接默认都是持久连接。  

二、HTTP报文详解

  用于HTTP协议交互的信息就被称为HTTP报文,请求段的叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。

  2.1 HTTP报文结构

  (1)HTTP报文大致可以分为报文首部和报文主体两块

  (2)请求报文和响应报文的结构实例

  2.2 部分内容的范围请求

  通常下载一个大文件时如果遇到网络中断的情况,那就必须重头开始,因此为了解决上述问题,就需要一种可恢复的机制。所谓恢复就是指从之前下载的中断处恢复下载。要实现该功能需要制定下载的实体范围,这就叫范围请求(Range Request)。

  对一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。执行范围请求时,就会用到Range来指定资源的byte范围。

  2.3 内容协商机制

  内容协商机制就是指在客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会议响应资源的语言、字符集、编码方式等作为判断的基准。

So,有哪些判断的基准呢?

Accept

Accept-Charset

Accept-Encoding

Accept-Language

Content-Language

  2.4 HTTP状态码

  HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。

  (1)2XX 成功 → 表明请求被正常处理了,如200 OK,204 No Content,206 Partial Content

  (2)3XX 重定向 → 表明浏览器需要执行某些特殊的处理以正确处理请求。如301 Moved Permanently(永久移动),302 Found(临时移动),303 See Other(资源的URI已更新,是否能临时按新的URI访问)、304 Not Modified(资源已找到,但未符合条件请求)、307 Temporary Redirect(临时重定向)

  (3)4XX 客户端错误 → 表明客户端是发生错误的原因所在。如400 Bad Request(请求报文中存在语法错误),401 Unauthorized(认证失败或未认证)、403 Forbidden(不允许访问这个资源)、404 Not Found(服务器上没有请求的资源)。

  (4)5XX 服务器错误 → 表明服务器本身发生错误。如500 Internal Server Error(服务器端在执行请求时发生了错误,也可能是Web应用存在的Bug或某些临时的故障),503 Service Unavailable(表明服务器暂时处于超负载或正在停机维护,无法处理请求)。

  2.5 HTTP首部

   HTTP/1.1规范定义了如下47种首部字段:

  (1)通用首部字段

  (2)请求首部字段 

  (3)响应首部字段

  (4)实体首部字段

三、确保Web安全

  3.1 HTTPS

  在HTTP协议中有可能存在信息窃听或者身份伪装等安全问题,即使已经过加密处理的通信,也会被窥视到通信内容。例如:使用一些抓包软件如Packet Capture或Sniffer就可以抓取相同段上的通信。使用HTTPS(HTTP Secure)通信机制就可以有效地防止这些问题。

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

  HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。通常情况下,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简而言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP

  SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说,SSL是当今世界上应用最为广泛的网络安全技术。在采用了SSL之后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。

  既然HTTPS安全可靠,那为何所有的Web网站不一直使用HTTPS?

一是因为与纯文本通信相比,加密通信会消耗更多的CPU以及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定会随之减少。

二是购买证书的开销也很大,要进行HTTPS通信,证书是必不可少的,而使用的证书必须要向认证机构(CA)购买。通常,一年的授权费用需要600人民币左右。  

所以,如果是非敏感信息一般都使用HTTP通信,只有在包含个人信息等敏感数据时,才会使用HTTPS加密通信

  3.2 确认访问用户身份的认证

  某些Web页面只想让特定的人浏览,或者干脆本人可见。未达到这个目标,必不可少的就是认证功能。

  HTTP/1.1使用的认证方式如下:

  (1)BASIC认证(基本认证) → 不够灵活,达不到多数Web网站期望的安全性等级(直接发送明文密码BASE64编码),因此它并不常用。

  (2)DIGEST认证(摘要认证) → 采用质询响应方式,相比BASIC认证,密码泄露的可能性就降低了。

  (3)SSL客户端认证 → 借助HTTPS的客户端证书完成认证,凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。

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

通常情况下,一种安全的保存方法是:先利用密码加盐(Salt)的方式增加额外信息,再使用散列(Hash)函数计算出散列值后保存。

四、Web的攻击技术

  4.1 针对Web应用的攻击模式

  (1)主动攻击:攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。最具典型的攻击就是 SQL注入攻击和OS命令注入攻击。

  (2)被动攻击:利用圈套策略执行攻击代码地攻击模式,在被动攻击过程中,攻击者不直接对目标Web应用访问发起攻击。

  4.2 跨站脚本攻击(XSS)

  跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript脚本进行攻击的一种攻击。

  跨站脚本攻击可以造成以下影响:

  (1)利用虚假输入表单骗取用户个人信息。

  (2)利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。

  (3)显示伪造的文章或者图片。

  4.3 SQL注入攻击

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

  SQL注入攻击有可能造成以下影响:

  (1)非法查看或篡改数据库内的数据。

  (2)规避认证。

  (3)执行和数据库服务器业务关联的程序等。

  4.4 OS命令注入攻击

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

  4.5 HTTP首部注入攻击

  HTTP首部注入攻击是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主题的一种攻击。属于被动攻击模式。

  4.6 因会话管理疏忽引发的安全漏洞

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

  (2)会话固定攻击:强制用户使用攻击者指定的会话ID,属于被动攻击。

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

  CSRF有可能造成以下影响:

1、利用已通过认证的用户权限更新设定信息等;

2、利用已通过认证的用户权限购买商品;

3、利用已通过认证的用户权限在留言板上发表言论等;

  4.7 DoS攻击

  DoS攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫作服务停止或拒绝服务攻击。主要有以下两种DoS攻击方式:

  (1)集中利用访问请求造成资源过载,资源用尽的同时,实际上也就呈停止状态。

  单纯来讲,就是发送大量的合法请求,服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击。多台计算机发起的DoS攻击成为DDoS攻击(Distributed Denial of Service attack),DDoS攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。

  (2)通过攻击安全漏洞使服务停止。

 

posted @ 2016-10-30 21:05  EdisonZhou  阅读(5707)  评论(3编辑  收藏  举报