《图解HTTP》学习笔记

文章目录

置顶

  1. 这个笔记是本人在有一定基础的情况下做的,所以有很多基础的就不记了。

第1章:了解Web及网络基础

1. HTTP

  • HTTP/0.9: HTTP于1990年问世
  • HTTP/1.0: 在1996年5月正式作为标准被公布,称为1.0版本,至今仍被广泛使用
  • HTTP/1.1: 1997年1月公布,之后又有修订
  • HTTP/2.0: 正在制定完善中

2. TCP/IP/DNS

  • TCP: 负责可靠传输
  • IP: 负责传输
  • DNS: 负责域名解析(应用层)

3. URI/URL

  • URI: 统一资源标识符,标识某一互联网资源
  • URL: 统一资源定位符,标识资源的地点,URL是URI的子集
    //URI例子
    ftp://ftp.is.co.za/rfc/rfc1808.txt
    http://www.ietf.org/rfc/rfc2396.txt
    ldap://[2001:db8::7]/c=GB?objectClass?one
    mailto:John.Doe@example.com
    news:comp.infosystems.www.servers.unix
    tel:+1-816-555-1212
    telnet://192.0.2.16:80/
    urn:oasis:names:specification:docbook:dtd:xml:4.1.2

4. RFC

  • 有一些用来制定 HTTP 协议技术标准的文档,它们被称为RFC(Request for Comments,征求修正意见书)。
  • 通常,应用程序会遵照由 RFC 确定的标准实现。但是也有些不遵守。

第2章:简单的HTTP协议

1. 请求头与响应头

  • 请求头
    方法 URI 协议版本
    请求首部字段(可选)
    \r\n
    内容实体
  • 响应头
    协议版本 状态码 状态码的原因短语
    响应首部字段(可选)
    \r\n
    内容主体

2. HTTP是不保存状态的协议

  • 也就是说,在HTTP这个级别,协议对于发送过的请求和相应都不做持久化处理
  • 但是有些需要保持登录状态的网站,需要保存用户的状态
  • HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。Cookie在后面详解

3. HTTP方法

  • 总览

    方法说明支持的 HTTP 协议版本
    GET获取资源1.0、1.1
    POST传输实体主体1.0、1.1
    PUT传输文件1.0、1.1
    HEAD获得报文首部1.0、1.1
    DELETE删除文件1.0、1.1
    OPTIONS询问支持的方法1.1
    TRACE追踪路径1.1
    CONNECT要求用隧道协议连接代理1.1
    LINK建立和资源之间的联系1.0
    UNLINE断开连接关系1.0
  • GET

    • 请求
        GET /index.html HTTP/1.1
        Host: www.hackr.jp
    
    • 响应
        返回 index.html 的页面资源
    
  • POST

    • 请求
        POST /submit.cgi HTTP/1.1
        Host: www.hackr.jp
        Content-Length: 1560(1560字节的数据)
    
    • 响应
        返回 submit.cgi 接收数据的处理结果
    
  • PUT

    • PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请
      求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类Web 网站,就可能会开放使用 PUT 方法。
    • 请求
        PUT /example.html HTTP/1.1
        Host: www.hackr.jp
        Content-Type: text/html
        Content-Length: 1560(1560 字节的数据)
    
    • 响应
        响应返回状态码 204 No Content(比如 :该 html 已存在于服务器上)
    
  • HEAD

    • HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。
    • 请求
        HEAD /index.html HTTP/1.1
        Host: www.hackr.jp
    
    • 响应
        返回index.html有关的响应首部
    
  • DELETE

    • DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。
    • 请求
        DELETE /example.html HTTP/1.1
        Host: www.hackr.jp
    
    • 响应
        响应返回状态码 204 No Content(比如 :该 html 已从该服务器上删除)
    
  • OPTIONS

    • OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
    • 请求
        OPTIONS * HTTP/1.1
        Host: www.hackr.jp
    
    • 响应
        HTTP/1.1 200 OK
        Allow: GET, POST, HEAD, OPTIONS(返回服务器支持的方法)
    
  • TRACE

    • TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
    • 客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE 方法就是用来确认连接过程中发生的一系列操作。
    • 请求
        TRACE / HTTP/1.1
        Host: hackr.jp
        Max-Forwards: 2
        HTTP/1.1 200 OK
        Content-Type: message/http
    
    • 响应
        Content-Length: 1024
        TRACE / HTTP/1.1
        Host: hackr.jp
        Max-Forwards: 2(返回响应包含请求内容)
    
  • CONNECT

    • CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
    • 请求
        CONNECT proxy.hackr.jp:8080 HTTP/1.1
        Host: proxy.hackr.jp
    
    • 响应
        HTTP/1.1 200 OK(之后进入网络隧道)
    

4. 持久连接节省通信量

  • 问题:
    HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。
    1. 持久性连接
      为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
    • 减少TCP连接次数,减轻服务器负载
    • Web页面显示速度加快
    1. 管线化
    • 简单来说就是不等待响应,直接发送下一个请求
    • 从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。管线化技术则比持久连接还要快。请求数越多,时间差就越明显。

5. 使用Cookie的状态管理

    1. HTTP是无状态的,即服务器不保存客户端的情况,响应之后就不管它是谁谁了。如果让服务器管理全部客户端状态则会成为负担。但这样就不能处理需要登录的情况,所以引入了Cookie技术
    1. Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
    1. Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
    1. 服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一
      个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前
      的状态信息。
    1. Cookie交互
      1. 请求报文(没有 Cookie 信息的状态)
        //第一次连接
        GET /reader/ HTTP/1.1
        Host: hackr.jp
        *首部字段内没有Cookie的相关信息
    
      1. 响应报文(服务器端生成 Cookie 信息)
        HTTP/1.1 200 OK
        Date: Thu, 12 Jul 2012 07:12:20 GMT
        Server: Apache
        <Set-Cookie: sid=1342077140226724; path=/; expires=Wed,10-Oct-12 07:12:20 GMT>
        Content-Type: text/plain; charset=UTF-8
    
      1. 请求报文(自动发送保存着的 Cookie 信息)
        GET /image/ HTTP/1.1
        Host: hackr.jp
        Cookie: sid=1342077140226724
    
      1. 服务器根据再收到的cookie知道是谁连接的

第3章:HTTP报文内的HTTP信息

1. HTTP报文

  • 请求报文
    报文首部
        - 请求行(包含用于请求的方法,请求 URI 和 HTTP 版本。)
        - 请求首部字段
        - 通用首部字段
        - 实体首部字段
        - 其他(如Cookie等RFC未规定的内容)
    空行(CR+LF)
    报文主体
  • 响应报文
    报文首部
        - 状态行(包含表明响应结果的状态码,原因短语和 HTTP 版本。)
        - 响应首部字段
        - 通用首部字段
        - 实体首部字段
        - 其他(如Cookie等RFC未定义的内容)
    空行(CR+LF)
    报文主体

2. 编码提高传输效率

    1. 报文主体和实体主体的区别
    • 通常,报文主体等于实体主体。
    • 只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
    1. 压缩传输的内容编码
    • 内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。(类似于压缩文件)
    • 常用的内容编码
      • gzip(GNU zip)
      • compress(UNIX 系统的标准压缩)
      • deflate(zlib)
      • identity(不进行编码)
    1. 分割发送的分块传输编码
    • 在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked TransferCoding)

3. 发送多种数据的多部分对象集合

  • 发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了 MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。
  • 相应地,HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
    • multipart/form-data
      在 Web 表单文件上传时使用。
    • multipart/byteranges
      状态码 206(Partial Content,部分内容)响应报文包含了多
    • 在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
        Content-Type: multipart/form-data;
    

4. 获取部分内容的范围请求

  • 以前,用户不能使用现在这种高速的带宽访问互联网,当时,下载一个尺寸稍大的图片或文件就已经很吃力了。如果下载过程中遇到网络中断的情况,那就必须重头开始。为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。
  • 对一份 10 000 字节大小的资源,如果使用范围请求,可以只请求5001~10 000 字节内的资源。
  • 例子
    • 5001~10 000 字节
        Range: bytes=5001-10000
    
    • 从 5001 字节之后全部的
        Range: bytes=5001-
    
    • 从一开始到 3000 字节和 5000~7000 字节的多重范围
        Range: bytes=-3000, 5000-7000
    
  • 针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。另外,对于多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byteranges 后返回响应报文。
  • 如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容。

5. 内容协商返回最合适的内容

  • 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
  • 包含在请求报文中的某些首部字段(如下)就是判断的基准。
    • Accept
    • Accept-Charset
    • Accept-Encoding
    • Accept-Language
    • Content-Language
  • 内容协商技术有以下 3 种类型。
    • 服务器驱动协商(Server-driven Negotiation)
      由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。
    • 客户端驱动协商(Agent-driven Negotiation)
      由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或手机版页面。
    • 透明协商(Transparent Negotiation)
      是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

第4章:返回结果的HTTP状态码

1. 状态码类别

状态码类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

以下为常用的14中状态码

2. 2XX成功

2.1 200 OK
  • 正常处理
2.2 204 No Content
  • 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。
  • 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
2.3 206 Partial Content
  • 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3. 3XX 重定向

3.1 301 Moved Permanently
  • 永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
  • 像下方给出的请求 URI,当指定资源路径的最后忘记添加斜杠“/”,就会产生 301 状态码。
    http://example.com/sample
    
3.2 302 Found
  • 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
  • 和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码的页面对应的 URI。
3.3 303 See Other
  • 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET方法定向获取请求的资源。
  • 303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。
  • 比如,当使用 POST 方法访问 CGI 程序,其执行后的处理结果是希望客户端能以 GET 方法重定向到另一个 URI 上去时,返回 303 状态码。虽然 302 Found 状态码也可以实现相同的功能,但这里使用 303状态码是最理想的。
3.4 304 Not Modified
  • 该状态码表示客户端发送附带条件的请求 2 时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
  • 附带条件的请求是指采用 GET 方法的请求报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。
  • 服务器说:资源已经找到,但是不符合条件请求
3.5 307 Temporary Redirect
  • 临时重定向。该状态码与 302 Found 有着相同的含义。尽管 302 标准禁止 POST 变换成 GET,但实际使用时大家并不遵守。
  • 307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。

4. 4XX 客户端错误

4.1 400 Bad Request
  • 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。
  • 服务器无法理解请求
4.2 401 Unauthorized
  • 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。
  • 返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。
4.3 403 Forbidden
  • 该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述,这样就能让用户看到了。
  • 未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。
  • 即服务器不允许访问那个资源
4.4 404 Not Found
  • 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

5. 5XX 服务器错误

5.1 500 Internal Server Error
  • 该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。
  • 服务器内部资源出故障
5.2 503 Service Unavailable
  • 服务器正忙
  • 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入RetryAfter 首部字段再返回给客户端。

6. 状态码和状况的不一致

  • 不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。
  • 比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到。

第5章:与 HTTP 协作的 Web 服务器

1. 用单台虚拟主机实现多个域名

  • HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。
  • 若一台服务器上有多个域名,这些域名解析后的IP地址会相同
  • 在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。

2. 通信数据转发程序 :代理、网关、隧道

    1. 代理
    • 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
    • 使用代理服务器的理由有:
      • 利用缓存技术(稍后讲解)减少网络带宽的流量
      • 组织内部针对特定网站的访问控制
      • 以获取访问日志为主要目的,等等。
    • 代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。
      • 缓存代理
        代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
      • 透明代理
        转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
    1. 网关
    • 网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
    • 利用网关可以由 HTTP 请求转化为其他协议通信
      客户端<--------------->网关<--------->非HTTP服务器
          Http请求和响应        其他协议
      
    • 利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL 语句查询数据。另外,在 Web 购物网站上进行信用卡结算时,网关可以和信用卡结算系统联动。
    1. 隧道
    • 隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
    • 隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
    • 隧道本身是透明的,客户端不用在意隧道的存在

3. 保存资源的缓存

  • 缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
  • 缓存有有效期限
  • 客户端(浏览器)也可以缓存,也有有效期限

第6章:HTTP首部

1. HTTP 首部字段一览

  • 通用首部字段
首部字段名说明
Cache-Control控制缓存的行为
Connection逐跳首部、连接的管理
Date创建报文的日期时间
Pragma报文指令
Trailer报文末端的首部一览
Transfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器的相关信息
Warning错误通知
  • 请求首部字段
首部字段名说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的内容编码
Accept-Language优先的语言(自然语言)
AuthorizationWeb认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在服务器
If-Match比较实体标记(ETag)
If-Modified-Since比较资源的更新时间
If-None-Match比较实体标记(与 If-Match 相反)
If-Range资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards最大传输逐跳数
Proxy-Authorization代理服务器要求客户端的认证信息
Range实体的字节范围请求
Referer对请求中 URI 的原始获取方
TE传输编码的优先级
User-AgentHTTP 客户端程序的信息
  • 响应首部字段
首部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP服务器的安装信息
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息
  • 实体首部字段
首部字段名说明
Allow资源可支持的HTTP方法
Content-Encoding实体主体适用的编码方式
Content-Language实体主体的自然语言
Content-Length实体主体的大小(单位:字节)
Content-Location替代对应资源的URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围
Content-Type实体主体的媒体类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期时间

2. 非 HTTP/1.1 首部字段

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

3. 通用首部字段

4. 请求首部字段

5. 响应首部字段

6. 实体首部字段

  • 这四个都是讲字段的具体内容,先不做笔记了,有点多和麻烦,需要的时候再搜吧。

7. 为Cookie服务的首部字段

  • 总览
首部字段名说明首部类型
Set-Cookie开始状态管理所使用的Cookie信息响应首部字段
Cookie服务器接收到的Cookie信息请求首部字段
  • set-cookie
    • 当服务器准备开始管理客户端的状态时,会事先告知各种信息。下面的表格列举了 Set-Cookie 的字段值。
    Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path
属性说明
NAME=VALUE赋予 Cookie 的名称和其值(必需项)
expires=DATECookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名)
Secure仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly加以限制,使 Cookie 不能被 JavaScript 脚本访问
  • cookie
    • 首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个Cookie 时,同样可以以多个 Cookie 形式发送。
        Cookie: status=enable
    

8. 其他首部字段

  • HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。
  • X-Frame-Options
    • 首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
    • 首部字段 X-Frame-Options 有以下两个可指定的字段值。
      • DENY :拒绝
      • SAMEORIGIN :仅同源域名下的页面(Top-level-browsing-context)匹配时许可。(比如,当指定 http://hackr.jp/sample.html页面为 SAMEORIGIN 时,那么 hackr.jp 上所有页面的 frame 都被允许可加载该页面,而 example.com 等其他域名的页面就不行了)
        X-Frame-Options: DENY
    
  • X-XSS-Protection
    • 首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
    • 首部字段 X-XSS-Protection 可指定的字段值如下。
      • 0 :将 XSS 过滤设置成无效状态
      • 1 :将 XSS 过滤设置成有效状态
        X-XSS-Protection: 1
    
  • DNT
    • 首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
    • 首部字段 DNT 可指定的字段值如下。
      • 0 :同意被追踪
      • 1 :拒绝被追踪
    • 由于首部字段 DNT 的功能具备有效性,所以 Web 服务器需要对 DNT做对应的支持。
        DNT: 1
    
  • P3P
    • 首部字段 P3P 属于 HTTP 相应首部,通过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
    • 要进行 P3P 的设定,需按以下操作步骤进行。
      • 步骤 1:创建 P3P 隐私
      • 步骤 2:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
      • 步骤 3:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中

第7章 确保 Web 安全的 HTTPS

1. HTTP 主要有这些不足,例举如下。

1. 通信使用明文(不加密),内容可能会被窃听
  • TCP/IP是可能被窃听的网络
    • 即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到的。
  • 加密处理防止被窃听
    • 通信的加密
      • HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容。
      • 用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP通信了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 HTTP over SSL。
    • 内容的加密
      • 即对报文首部不加密,对报文主体加密
      • 为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制。
      • 由于该方式不同于 SSL 或 TLS 将整个通信线路加密处理,所以内容仍有被篡改的风险。
2. 不验证通信方的身份,因此有可能遭遇伪装
  • 任何人都可发起请求
    • 由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应
    • 仅限于发送端的 IP 地址和端口号没有被 Web 服务器设定限制访问的前提下
    • 存在的各种隐患
      • 无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器。
      • 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
      • 无法确定正在通信的对方是否具备访问权限。因为某些Web 服务器上保存着重要的信息,只想发给特定用户通信的权限。
      • 无法判定请求是来自何方、出自谁手。
      • 即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)
  • 查明对手的证书
    • 虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL 则可以。SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。
    • 证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说是异常困难的一件事。所以只要能够确认通信方(服务器或客户端)持有的证书,即可判断通信方的真实意图。
    • 通过使用证书,以证明通信方就是意料中的服务器。这对使用者个人来讲,也减少了个人信息泄露的危险性。
    • 另外,客户端持有证书即可完成个人身份的确认,也可用于对 Web 网站的认证环节。
3. 无法证明报文的完整性,所以有可能已遭篡改
  • 接收到的内容可能有误
    • 请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack,MITM)。
  • 如何防止篡改
    • 虽然有使用 HTTP 协议确定报文完整性的方法,但事实上并不便捷、可靠。其中常用的是 MD5 和 SHA-1 等散列值校验的方法,以及用来确认文件的数字签名方法。这些问题不仅在 HTTP 上出现,其他未加密的协议中也会存在这类问题。
    • 提供文件下载服务的 Web 网站也会提供相应的以 PGP(PrettyGood Privacy,完美隐私)创建的数字签名及 MD5 算法生成的散列值。PGP 是用来证明创建文件的数字签名,MD5 是由单向函数生成的散列值。不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。浏览器无法自动帮用户检查。
    • 可惜的是,用这些方法也依然无法百分百保证确认结果正确。因为 PGP 和 MD5 本身被改写的话,用户是没有办法意识到的。
    • 为了有效防止这些弊端,有必要使用 HTTPS。SSL 提供认证和加密处理及摘要功能。仅靠 HTTP 确保完整性是非常困难的,因此通过和其他协议组合使用来实现这个目标。

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

1. HTTP 加上加密处理和认证以及完整性保护后即是 HTTPS
  • 我们把添加了加密及认证机制的 HTTP 称为 HTTPS(HTTP Secure)。
2. HTTPS 是身披 SSL 外壳的 HTTP
  • 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 是当今世界上应用最为广泛的网络安全技术。
3. 相互交换密钥的公开密钥加密技术

SSL 采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。近代的加密方法中加密算法是公开的,而密钥却是保密的。通过这种
方式得以保持加密方法的安全性。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。如果密钥被攻击者获得,那加密也就失去了意义。

  • 共享密钥加密的困境(对称加密)
    • 加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system),也被叫做对称密钥加密。
    • 密钥发送问题,怎么保证秘钥不会被劫持监听
  • 使用两把密钥的公开密钥加密(非对称加密)
    • 公开密钥加密使用一对非对称的密钥。一把叫做私有密钥(private key),另一把叫做公开密钥(public key)。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
    • 使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
  • HTTPS 采用混合加密机制
    • 若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
    • 充分利用两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
4. 证明公开密钥正确性的证书
  • 公开密钥加密方式还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥。
  • 为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
  • 可证明组织真实性的 EV SSL 证书
    • 证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。拥有该特性的证书就是 EV SSL 证书(Extended Validation SSL Certificate)。
    • 持有 EV SSL 证书的 Web 网站的浏览器地址栏处的背景色是绿色的,从视觉上就能一眼辨别出。而且在地址栏的左侧显示了 SSL证书中记录的组织名称以及颁发证书的认证机构的名称。
    • 上述机制的原意图是为了防止用户被钓鱼攻击(Phishing),但就效果上来讲,还得打一个问号。很多用户可能不了解 EV SSL证书相关的知识,因此也不太会留意它。
  • 用以确认客户端的客户端证书
    • HTTPS 中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。
    • 现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。比如那些可支撑客户端证书支出费用的业务。例如,银行的网上银行就采用了客户端证书。在登录网银时不仅要求用户确认输入 ID 和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。
  • 认证机构信誉第一
  • 由自认证机构颁发的证书称为自签名证书
    • 如果使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。
    • 浏览器访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。
    • 多数浏览器内预先已植入备受信赖的认证机构的证书,但也有一小部分浏览器会植入中级认证机构的证书。对于中级认证机构颁发的服务器证书,某些浏览器会以正规的证书来对待,可有的浏览器会当作自签名证书。
5. HTTPS 通信过程
    1. Client—>Server Handshake:ClientHello
      客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
    1. Server—>Client Handshake:ServerHello
      服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
    1. Server—>Client Handshake:Certificate
      之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
    1. Server—>Client Handshake:ServerHelloDone
      最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
    1. Client—>Server Handshake:ClientKeyExchange
      SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。
    1. Client—>Server ChangeCipherSpec
      接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
    1. Client—>Server Handshake:Finished
      客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
    1. Server—>Client ChangeCipherSpec
      服务器同样发送 Change Cipher Spec 报文。
    1. Server—>Client Handshake:Finished
      服务器同样发送 Finished 报文。
    1. Client—>Server Application Data(HTTP)
      服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
    1. Server—>Client Application Data(HTTP)
      应用层协议通信,即发送 HTTP 响应。
    1. Client—>Server Alert:warning,close_notify
      最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
6. HTTPS 的安全通信机制
  • SSL 和 TLS
    • SSL 技术最初是由浏览器开发商网景通信公司率先倡导的,开发过 SSL3.0 之前的版本。目前主导权已转移到 IETF(InternetEngineering Task Force,Internet 工程任务组)的手中。
    • IETF 以 SSL3.0 为基准,后又制定了 TLS1.0、TLS1.1 和TLS1.2。TSL 是以 SSL 为原型开发的协议,有时会统一称该协议为 SSL。当前主流的版本是 SSL3.0 和 TLS1.0。
    • 由于 SSL1.0 协议在设计之初被发现出了问题,就没有实际投入使用。SSL2.0 也被发现存在问题,所以很多浏览器直接废除了该协议版本。
  • SSL 速度慢吗
    • HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。
    • HTTPS 比 HTTP 要慢 2 到 100 倍
    • SSL 的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU 及内存等资源,导致处理速度变慢。
      • 通信慢:除去和TCP 连接、发送 HTTP 请求 • 响应以外,还必须进行 SSL 通信,因此整体上处理通信量不可避免会增加。
      • 消耗大:SSL 必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起 HTTP 会更多地消耗服务器和客户端的硬件资源,导致负载增强。
  • 为什么不全使用HTTPS
      1. 比HTTP慢,消耗资源多
      1. 证书要钱,减少开销

第8章 确认访问用户身份的认证

1. 何为认证

  • 计算机本身无法判断坐在显示器前的使用者的身份。进一步说,也无法确认网络的那头究竟有谁。可见,为了弄清究竟是谁在访问服务器,就得让对方的客户端自报家门。
  • 核对的信息有如下几个
    • 密码:只有本人才会知道的字符串信息。
    • 动态令牌:仅限本人持有的设备内显示的一次性密码。
    • 数字证书:仅限本人(终端)持有的信息。
    • 生物认证:指纹和虹膜等本人的生理信息。
    • IC 卡等:仅限本人持有的信息。
  • HTTP/1.1 使用的认证方式
    • BASIC 认证(基本认证)
    • DIGEST 认证(摘要认证)
    • SSL 客户端认证
    • FormBase 认证(基于表单认证)

2. BASIC 认证

  • BASIC 认证(基本认证)是从 HTTP/1.0 就定义的认证方式。即便是现在仍有一部分的网站会使用这种认证方式。是 Web 服务器与通信客户端之间进行的认证方式。
  • BASIC 认证使用上不够便捷灵活,且达不到多数 Web 网站期望的安全性等级,因此它并不常用
  • 步骤
      1. Client—>Server GET
        请求的资源需要 BASIC 认证
      1. Server—>Client 401
        服务器会随状态码 401 Authorization Required,返回带 WWW-Authenticate 首部字段的响应。该字段内包含认证的方式(BASIC) 及 Request-URI 安全域字符串(realm)。
      1. Client—>Server
        接收到状态码 401 的客户端为了通过 BASIC 认证,需要将用户 ID 及密码发送给服务器。发送的字符串内容是由用户 ID 和密码构成,两者中间以冒号(:)连接后,再经过 Base64 编码处理。
      //例子
      //假设用户 ID 为 guest,密码是 guest,连接起来就会形成guest:guest 这样的字符串。
      //然后经过 Base64 编码,最后的结果即是Z3Vlc3Q6Z3Vlc3Q=。
      //把这串字符串写入首部字段 Authorization 后,发送请求。
      GET /private/ HTTP/1.1
      Host: hackr.jp
      Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
      
      1. Server—>Client
        服务器认证成功返回200,失败返回401
  • BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。
  • 另外,除此之外想再进行一次 BASIC 认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一。

3. DIGEST 认证

  • 为弥补 BASIC 认证存在的弱点,从 HTTP/1.1 起就有了 DIGEST 认证。 DIGEST 认证同样使用质询 / 响应的方式(challenge/response),但不会像 BASIC 认证那样直接发送明文密码。
  • 质询响应方式
    是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。
  • 步骤
      1. Client—>Server GET
        请求的资源需要 BASIC 认证
      1. Server—>Client 401
        服务器会随状态码 401 Authorization Required,返回带 WWW-Authenticate 首部字段的响应。该字段内包含质问响应方式认证所需的临时质询码(随机数,nonce)
      1. Client—>Server
        接收到 401 状态码的客户端,返回的响应中包含 DIGEST 认证必须的首部字段 Authorization 信息。
      1. Server—>Client
        接收到包含首部字段 Authorization 请求的服务器,会确认认证信息的正确性。认证通过后则返回包含 Request-URI 资源的响应。

4. SSL 客户端认证

  • 从使用用户 ID 和密码的认证方式方面来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户 ID 和密码被盗,就很有可能被第三者冒充。利用 SSL 客户端认证则可以避免该情况的发生。

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

  • 步骤

    • 接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。
    • 用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
    • 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始 HTTPS 加密通信。
  • SSL 客户端认证必要的费用

    • 使用 SSL 客户端认证需要用到客户端证书。而客户端证书需要支付一定费用才能使用。

5. 基于表单认证

  • 基于表单的认证方法并不是在 HTTP 协议中定义的。客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证。
1. 认证多半为基于表单认证
  • 由于使用上的便利性及安全性问题,HTTP 协议标准提供的 BASIC 认证和 DIGEST 认证几乎不怎么使用。另外,SSL 客户端认证虽然具有高度的安全等级,但因为导入及维持费用等问题,还尚未普及。
  • 不具备共同标准规范的表单认证,在每个 Web 网站上都会有各不相同的实现方式。
2. Session 管理及 Cookie 应用
  • 基于表单认证本身是通过服务器端的 Web 应用,将客户端发送过来的用户 ID 和密码与之前登录过的信息做匹配来进行认证的。
  • 但鉴于 HTTP 是无状态协议,之前已认证成功的用户状态无法通过协议层面保存下来。即,无法实现状态管理,因此即使当该用户下一次继续访问,也无法区分他与其他的用户。于是我们会使用 Cookie 来管理 Session,以弥补 HTTP 协议中不存在的状态管理功能。
  • 步骤
      1. 客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常是以 POST 方法把请求发送给服务器。而这时,会使用 HTTPS通信来进行 HTML 表单画面的显示和用户输入数据的发送。
      1. 服务器会发放用以识别用户的 Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。
        向客户端返回响应时,会在首部字段 Set-Cookie 内写入 SessionID(如 PHPSESSID=028a8c…)。
        另外,为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie内加上 httponly 属性。
      1. 客户端接收到从服务器端发来的 Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以 Session ID 也随之发送到服务器。服务器端可通过验证接收到的 Session ID 识别用户和其认证状态。
  • 通常,一种安全的保存方法是,先利用给密码加盐(salt) 1 的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。但是我们也经常看到直接保存明文密码的做法,而这样的做法具有导致密码泄露的风险。

第9章:基于 HTTP 的功能追加协议

1. 消除 HTTP 瓶颈的 SPDY

  • 互联网工程任务组(IETF)对谷歌提出的SPDY协议进行了标准化,于2015年5推出了类似于SPDY协议的 HTTP 2.0 协议标准(简称HTTP/2)。谷歌因此宣布放弃对SPDY协议的支持,转而支持HTTP/2。谷歌称,计划于 2016 年初在 Chrome 中移除 SPDY,并将为Chrome 40 添加 HTTP/2 协议支持。

  • 总之就是弃用了

  • HTTP的瓶颈

    • 一条连接上只可发送一个请求。
    • 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
    • 请求 / 响应首部未经压缩就发送。首部信息越多延迟越大。发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
    • 可任意选择数据压缩格式。非强制压缩发送。
  • Ajax 的解决方法

    • Ajax(Asynchronous JavaScript and XML, 异 步 JavaScript 与 XML 技术)是一种有效利用 JavaScript 和 DOM(Document Object Model,文档对象模型)的操作,以达到局部 Web 页面替换加载的异步通信手段。和以前的同步通信相比,由于它只更新一部分页面,响应中传输的数据量会因此而减少,这一优点显而易见。
    • 而利用 Ajax 实时地从服务器获取内容,有可能会导致大量请求产生。另外,Ajax 仍未解决 HTTP 协议本身存在的问题。
  • Comet 的解决方法

    • 一旦服务器端有内容更新了,Comet 不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。
    • 通常,服务器端接收到请求,在处理完毕后就会立即返回响应,但为了实现推送功能,Comet 会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。因此,服务器端一旦有更新,就可以立即反馈给客户端。
    • 内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet也仍未解决 HTTP 协议本身存在的问题。

2. 使用浏览器进行全双工通信的 WebSocket

  • 利用 Ajax 和 Comet 技术进行通信可以提升 Web 的浏览速度。但问题在于通信若使用 HTTP 协议,就无法彻底解决瓶颈问题。WebSocket网络技术正是为解决这些问题而实现的一套新协议及 API。

  • WebSocket 协议

    • 一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML 或图片等任意格式的数据。
    • 由于是建立在 HTTP 基础上的协议,因此连接的发起方仍是客户端,而一旦确立 WebSocket 通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
  • WebSocket 协议的主要特点。

    • 推送功能
      支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
    • 减少通信量
      只要建立起 WebSocket 连接,就希望一直保持连接状态。和 HTTP 相比,不但每次连接时的总开销减少,而且由于 WebSocket 的首部信息很小,通信量也相应减少了。
    • 握手
      为了实现 WebSocket 通信,在 HTTP 连接建立之后,需要完成一次“握手”(Handshaking)的步骤。
      • 握手·请求
        为了实现 WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字段,告知服务器通信协议发生改变,以达到握手的目的。
        Sec-WebSocket-Key 字段内记录着握手过程中必不可少的键值。
        Sec-WebSocket-Protocol 字段内记录使用的子协议。子协议按 WebSocket 协议标准在连接分开使用时,定义那些连接的名称。
          GET /chat HTTP/1.1
          Host: server.example.com
          Upgrade: websocket
          Connection: Upgrade
          Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
          Origin: http://example.com
          Sec-WebSocket-Protocol: chat, superchat
          Sec-WebSocket-Version: 13
      
      • 握手·响应
        对于之前的请求,返回状态码 101 Switching Protocols 的响应。
        Sec-WebSocket-Accept 的字段值是由握手请求中的 Sec-WebSocket-Key 的字段值生成的。
        成功握手确立 WebSocket 连接之后,通信时不再使用 HTTP 的数据帧,而采用 WebSocket 独立的数据帧。
          HTTP/1.1 101 Switching Protocols
          Upgrade: websocket
          Connection: Upgrade
          Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
          Sec-WebSocket-Protocol: chat
      

第10章:构建 Web 内容的技术

1. HTML/CSS/JS

2. Web 应用

  • Web 应用是指通过 Web 功能提供的应用程序。比如购物网站、网上银行、SNS、BBS、搜索引擎和 e-learning 等。互联网(Internet)或企业内网(Intranet)上遍布各式各样的 Web 应用。原本应用 HTTP 协议的 Web 的机制就是对客户端发来的请求,返回事前准备好的内容。可随着 Web 越来越普及,仅靠这样的做法已不足以应对所有的需求,更需要引入由程序创建 HTML 内容的做法。
1. 与 Web 服务器及程序协作的 CGI
  • CGI(Common Gateway Interface,通用网关接口)是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。在 CGI 的作用下,程序会对请求内容做出相应的动作,比如创建 HTML 等动态内容。
  • 使用 CGI 的程序叫做 CGI 程序,通常是用 Perl、PHP、Ruby 和 C 等编程语言编写而成。
2. 因 Java 而普及的 Servlet
  • Servlet 是一种能在服务器上创建动态内容的程序。Servlet 是用 Java语言实现的一个接口,属于面向企业级 Java(JavaEE,Java Enterprise Edition)的一部分
  • CGI,由于每次接到请求,程序都要跟着启动一次。因此一旦访问量过大,Web 服务器要承担相当大的负载。而 Servlet 运行在与 Web 服务器相同的进程中,因此受到的负载较小。Servlet 的运行环境叫做 Web 容器或 Servlet 容器。
  • 随着 CGI 的普及,每次请求都要启动新 CGI 程序的 CGI 运行机制逐渐变成了性能瓶颈,所以之后 Servlet 和 mod_perl 等可直接在 Web 服务器上运行的程序才得以开发、普及。

3. 数据发布的格式及语言

1. XML
    <研讨会 编号="TR001" 主题="Web应用程序脆弱性诊断讲座">
        <类别>安全</类别>
        <概要>为深入研究Web应用程序脆弱性诊断必要的...</概要>
    </研讨会>
    <研讨会 编号="TR002" 主题="网络系统脆弱性诊断讲座">
        <类别>安全</类别>
        <概要>为深入研究网络系统脆弱性诊断必要的...</概要>
    </研讨会>
2. JSON
  • JSON(JavaScript Object Notation)是一种以JavaScript(ECMAScript)的对象表示法为基础的轻量级数据标记语言。能够处理的数据类型有 false/null/true/ 对象 / 数组 / 数字 / 字符串,这 7 种类型。
    {
        "name": "Web Application Security",
        "num": "TR001"
    }
3. 发布更新信息的 RSS/Atom
  • RSS(简易信息聚合,也叫聚合内容)和 Atom 都是发布新闻或博客日志等更新信息文档的格式的总称。两者都用到了 XML。

第11章:Web 的攻击技术

0. 说明

  • 因对安全知识了解不多,本章只是做了个大概的笔记,对很多还不懂。

1. 针对 Web 应用的攻击模式

以服务器为目标的主动攻击
  • 主动攻击(active attack)是指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
  • 主动攻击模式里具有代表性的攻击是 SQL 注入攻击和 OS 命令注入攻击。
以服务器为目标的被动攻击
  • 被动攻击(passive attack)是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。
  • 攻击模式
    • 步骤 1: 攻击者诱使用户触发已设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的 HTTP 请求。
    • 步骤 2: 当用户不知不觉中招之后,用户的浏览器或邮件客户端就会触发这个陷阱。
    • 步骤 3: 中招后的用户浏览器会把含有攻击代码的 HTTP 请求发送给作为攻击目标的 Web 应用,运行攻击代码。
    • 步骤 4: 执行完攻击代码,存在安全漏洞的 Web 应用会成为攻击者的跳板,可能导致用户所持的 Cookie 等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。
    • 被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。
  • 利用用户的身份攻击企业内部网络
    • 利用被动攻击,可发起对原本从互联网上无法直接访问的企业内网等网络的攻击。只要用户踏入攻击者预先设好的陷阱,在用户能够访问到的网络范围内,即使是企业内网也同样会受到攻击。
    • 很多企业内网依然可以连接到互联网上,访问 Web 网站,或接收互联网发来的邮件。这样就可能给攻击者以可乘之机,诱导用户触发陷阱后对企业内网发动攻击。

2. 因输出值转义不完全引发的安全漏洞

  • 实施 Web 应用的安全对策可大致分为以下两部分。
    • 客户端的验证
    • Web 应用端(服务器端)的验证
      • 输入值验证
      • 输出值转义
跨站脚本攻击
  • 跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。
  • 跨站脚本攻击有可能造成以下影响
    • 利用虚假输入表单骗取用户个人信息。
    • 利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
    • 显示伪造的文章或图片。
    • 对用户 Cookie 的窃取攻击
SQL 注入攻击
  • 会执行非法 SQL 的 SQL 注入攻击
    例如查询到用户密码
OS 命令注入攻击
  • OS 命令注入攻击(OS Command Injection)是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。
HTTP 首部注入攻击
  • HTTP 首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式
  • HTTP 首部注入攻击有可能会造成以下一些影响
    • 设置任何 Cookie 信息
    • 重定向至任意 URL
    • 显示任意的主体(HTTP 响应截断攻击)
    • HTTP 响应截断攻击
邮件首部注入攻击
  • 邮件首部注入(Mail Header Injection)是指 Web 应用中的邮件发送功能,攻击者通过向邮件首部 To 或 Subject 内任意添加非法内容发起的攻击。利用存在安全漏洞的 Web 网站,可对任意邮件地址发送广告邮件或病毒邮件。
目录遍历攻击
  • 目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击。
远程文件包含漏洞
  • 远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的 URL 充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击。

3. 因设置或设计上的缺陷引发的安全漏洞

强制浏览
  • 强制浏览有可能会造成以下一些影响。
    • 泄露顾客的个人信息等重要情报
    • 泄露原本需要具有访问权限的用户才可查阅的信息内容
    • 泄露未外连到外界的文件
  • 对那些原本不愿公开的文件,为了保证安全会隐蔽其 URL。可一旦知道了那些 URL,也就意味着可浏览 URL 对应的文件。直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使 URL 产生泄露。
  • 例子
    如加锁日记不想让别人看,但是别人知道日记中的某个图片的存放地址,就能直接通过URL访问这个图片
不正确的错误消息处理
  • 不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web 应用的错误信息内包含对攻击者有用的信息。
  • Web 应用不必在用户的浏览画面上展现详细的错误消息。对攻击者来说,详细的错误消息有可能给他们下一次攻击以提示。
  • 与 Web 应用有关的主要错误信息如下所示。
    • Web 应用抛出的错误消息
    • 数据库等系统抛出的错误消息
开放重定向
  • 开放重定向(Open Redirect)是一种对指定的任意 URL 作重定向跳转的功能。而于此功能相关联的安全漏洞是指,假如指定的重定向 URL到某个具有恶意的 Web 网站,那么用户就会被诱导至那个 Web 网站。

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

会话劫持
  • 会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。
  • 几种攻击者可获得会话 ID 的途径。
    • 通过非正规的生成方法推测会话 ID
    • 通过窃听或 XSS 攻击盗取会话 ID
    • 通过会话固定攻击(Session Fixation)强行获取会话 ID
会话固定攻击
  • 对以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话 ID,属于被动攻击。
跨站点请求伪造
  • 跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
  • 跨站点请求伪造有可能会造成以下等影响。
    • 利用已通过认证的用户权限更新设定信息等
    • 利用已通过认证的用户权限购买商品
    • 利用已通过认证的用户权限在留言板上发表言论

4. 其他安全漏洞

密码破解
  • 通过网络的密码试错
    • 穷举法,全试一遍
    • 字典攻击,构造好密码字典,一一尝试
  • 对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)
点击劫持
  • 点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)。
DoS 攻击
  • DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS 攻击的对象不仅限于 Web 网站,还包括网络设备及服务器等。
  • 主要有以下两种 DoS 攻击方式。
    • 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。
    • 通过攻击安全漏洞使服务停止。
后门程序
  • 后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能。
  • 通常的后门程序分为以下 3 种类型。
    • 开发阶段作为 Debug 调用的后门程序
    • 开发者为了自身利益植入的后门程序
    • 攻击者通过某种方法设置的后门程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值