美文网首页
《图解HTTP》读书笔记

《图解HTTP》读书笔记

作者: 海文_L | 来源:发表于2019-01-09 17:15 被阅读7次

    这段时间陆陆续续把《图解HTTP》这本书看完了。平时开发虽然跟HTTP打的交道比较多,但是还是缺乏对HTTP有个系统性的认识。本书主要从Web网络基础、什么是HTTP、HTTP的构造、HTTP的扩展以及安全问题等几个维度做了下介绍。本书的内容描述比较浅显易懂,结合文中举得例子、图例能使读者有个更深的理解。以下是根据个人理解对文中觉得比较关键的地方做了些摘要,整本书共241页,建议有兴趣的朋友可以自己阅读下本书。

    第一章 了解Web及网络基础

    使用HTTP协议访问WEB

    客户端:通过指定的访问地址获取(或上传)服务器
    服务器:使用HTTP与客户端通信

    网络基础TCP/IP

    概念:通常使用的网络是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。TCP/IP是互联网相关的各类协议族的总称。

    TCP/IP的分层管理

    应用层:决定了向用户提供应用服务时通信的活动。(FTP、DNS、HTTP)
    传输层:对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。(TCP(传输控制协议)、UDP(用户数据报协议))
    网络层:处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据传送给对方。
    数据链路层:用来处理连接网络的硬件部分。(操作系统、硬件的设备驱动、光纤等物理可见部分。)

    TCP/IP通信传输流

    发送端在层与层之间传输数据时,没经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。这种把数据信息包装起来的做法称为封装。


    TCP/IP通信传流
    与HTTP关系密切的协议:IP、TCP和DNS

    负责传输的IP协议-位于网络层
    IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址。(使用ARP协议凭借MAC地址进行通信。)
    确保可靠性的TCP协议-位于传输层
    采用三次握手策略,首先发送一个带SYN标志的数据包给对方,接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息,最后发送端再回传一个带ACK标志的数据包,代表握手结束。
    负责域名解析的DNS服务-位于应用层
    通过域名查找IP


    第二章 简单的HTTP协议

    重要概念
    • HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。
    • 请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
    • 响应报文是由协议版本、状态码、状态码的原因短语、响应首部字段、主体构成的。
    • HTTP协议对于发送过的请求或响应都不做持久化处理。
    告知服务器意图的HTTP方法
    方法名 作用 简述
    GET 获取资源 我想访问你的某个资源
    POST 传输实体主体 我要把这条信息告诉你
    PUT 传输文件 用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。存在安全性问题,一般WEB网站不使用该方法。
    HEAD 获得报文首部 把那个的相关信息告诉我。用于确认URI的有效性及资源更新的日期时间等。
    DELETE 删除文件 快把那份文件删掉吧,按URI删除指定的资源,与PUT一样不带验证机制
    OPTIONS 询问支持的方法 查询针对请求URI指定的资源支持的方法:你支持哪些方法?
    TRACE 追踪路径 让WEB服务器端讲之前的请求通信环回给客户端的方法。
    CONNECT 要求用隧道协议连接代理 要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要用SSL和TLS协议把通信内容加密后经网络隧道传输。格式:CONNECT 代理服务器名:端口号 HTTP版本
    持久连接节省通信量

    持久连接
    管线化:从前发送请求后需等待并接收到响应才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。

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

    第三章 HTTP报文内的HTTP信息

    请求报文及响应报文的结构
    请求报文、响应报文示例

    请求行:包含用于请求的方法,请求URI和HTTP版本
    状态行:包含表明响应结果的状态码,原因短语和HTTP版本
    首部字段:包含表示请求和响应的各种条件和属性的各类首部。(通用首部、请求首部、响应首部和实体首部)

    编码提升传输速率
    报文主体和实体主体的差异

    报文:是HTTP通信中的基本单位,由8位字节流组成,通过HTTP通信传输。
    实体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。

    压缩传输的内容编码

    指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。

    分割发送的分块传输编码
    • 分块传输编码会将实体主体分成多个部分,每一块都会用十六进制来标记块的大小,而实体主体的最后一块会用”0(CR+LF)“来标记。
    • 使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。
    发送多种数据的多部分对象集合

    发送的报文主体内可以含有多类型实体,通常是在图片或文本文件等上传时使用。
    对象如下:
    multipart/form-data:在WEB表单文件上传时使用
    multipart/byteranges:状态码206响应报文包含了多个范围的内容时使用

    获取部分内容的范围请求

    用首部字段Range来指定资源的byte范围

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

    概念:客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
    类型:
    服务器驱动协商:以请求的首部字段为参考,在服务器端自动处理。
    客户端驱动协商:用户从浏览器现实的可选项列表中手动选择。还可以利用javascript脚本在web页面上自动进行上述选择。比如按os的类型或浏览器类型,自动切换pc版页面或移动版页面。
    透明协商:两者的结合体,是有服务端和客户端各自进行内容协商的一种方法。


    第四章 返回结果的HTTP状态码

    状态码告知从服务器返回的请求结果

    第五章 与HTTP协作的web服务器

    用单台虚拟主机实现多个域名
    • 即只有一台物理服务器,使用虚拟主机的功能,则可以假想已具有多台服务器。
    • 必须在host首部内完整指定主机名或域名的URI。
    通信数据转发程序:代理、网关、隧道
    代理

    概念:一种有转发功能的应用程序,接受客户端发送的请求并发送给服务器,同时也接收服务器返回的响应并转发给客户端。在http通信过程中,可及联多台代理服务器,转发时附加via首部字段以标记出经过的主机信息。
    作用:利用缓存技术减少网络带宽的流量,组织内部针对特定网络的访问控制,以获取访问日志为主要目的。
    类型:
    缓存代理:代理转发响应时,预先将资源的副本保存在代理服务器上。当代理再次接收到对相同资源的请求时,将之前缓存的资源作为响应返回。
    透明代理:转发或请求响应时,不对报文做任何加工的代理类型被称为透明代理。

    网关

    概念:与代理类似,而网关能使通信线路上的服务器提供非http协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

    隧道

    概念:可按要求建立起一条与其他服务器的通信线路,届时使用ssl等加密手段进行通信,隧道的目的时确保客户端与服务器进行安全的通信。

    保存资源的缓存

    概念:当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。避免多次从源服务器转发资源。
    缓存的有效期限:若判断失效,会重新跟源服务器获取最新资源
    客户端缓存:如浏览器


    第六章 HTTP首部

    6.1 HTTP报文首部

    HTTP请求报文

    • 首部内容为客户端和服务器端分别处理请求和响应提供所需的信息。
    • 报文首部由请求行(方法、URI、HTTP版本)、HTTP首部字段(请求首部字段、通用首部字段、实体首部字段)

    HTTP响应报文

    • 在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段3部分组成。
    • 报文首部由状态行(HTTP版本、状态码)、HTTP首部字段(响应首部字段、通用首部字段、实体首部字段)

    6.2 HTTP首部字段

    HTTP首部字段传递重要信息:使用首部字段是为了给浏览器和服务器提供报文主题大小、所使用的语言、认证信息内容。
    HTTP首部字段结构:结构:【首部字段名:字段值,字段值】

    6.3 4种HTTP首部字段类型

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

    6.4 HTTP首部类型

    End-to-Header首部

    • 端到端首部分在此类中的首部会转发给请求/响应对应的最终接受目标,且必须保存在由缓存生成的响应汇总,另外规定它必须被转发。

    Hop-by-Hop首部

    • 逐跳首部分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。需提供Connection首部字段。
    • 除了以下首部字段之外,其他所有字段都属于端到端首部:Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade

    6.5 HTTP/1.1通用首部字段

    Cache-Control

    作用:通过制定指令,操作缓存的工作机制。

    Cache-Control指令

    指令 作用
    public 明确表明其他用户也可利用缓存
    private 响应只以特定的用户作为对象,与public相反
    no-cache 防止从缓存中返回过期的资源。客户端发送的请求包含no-cache指令,则表示客户端不会接收缓存过的响应。服务器端返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存
    no-store 暗示请求(和对应的响应)或响应中包含机密信息
    s-maxage=604800 适用于供多为用户使用的公共缓存服务器
    max-age=604800 请求:如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。当指定max-age为0,那么缓存服务器通常需要将请求转发给源服务器。返回:响应中包含该指令时,缓存服务器不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间。
    min-fresh=60 要求缓存服务器返回至少还未指定时间的缓存资源
    max-stale=3600 可指示缓存资源,即使过期也照常接收。如果指令未指定参数值,那么无论经过多久,客户端都会接收响应
    only-if-cached 表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。若发生请求无响应,则返回状态码504 Gateway Timeout。
    must-revalidate 代理会向原服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通再次获取有效资源的话,给客户端返回504状态码。
    proxy-revalidate 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
    no-transform 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。可防止缓存或代理压缩图片等类似操作。

    Pragma

    Connection

    作用:控制不在转发给代理的首部字段;管理持久连接(HTTP/1.1版本的默认连接都是持久连接,指定Connection首部字段的值为Close客户断开连接);

    Trailer

    事先说明在报文主体后记录了哪些首部字段。(不明觉厉??)

    Transfer-Encoding

    规定了传输报文主体时采用的编码方式

    Upgrade

    用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来制定一个完全不同的通信协议。需要额外指定Connection:Upgrade
    例子:
    Upgrade:TLS/1.0, HTTP/1.1
    Connection:Upgrade

    Via

    追踪客户端与服务器之间的请求和响应报文的传输路径。

    Warning

    通常会告知用户一些与缓存相关的问题的警告。

    6.6 请求首部字段

    概念:是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

    Accept

    可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。使用q=来额外标识权重值,范围是0~1,默认为1。

    类型

    • 文本文件:text/html, text/plain,text/css...
    • 图片文件:image/jpeg,image/gif,image/png
    • 视频文件:video/mpeg,video/quicktime
    • 应用程序使用的二进制文件:application/octet-stream,application/zip

    Accept-Charset:用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序,可一次性指定多种内容编码。使用q=来额外标识权重值,范围是0~1,默认为1。可使用*号作为通配符,指定任意的编码格式。
    例子
    gzip
    identity
    compress
    deflate

    Accept-Language:用来告知服务器用户代理能够处理的自然语言集(中文或英文等),使用q=来额外标识权重值,范围是0~1,默认为1。

    Authorization:用来告知服务器,用户代理的认证信息。

    Expect:期望服务器作出某种特定行为,如发现错误时,返回417。

    From:告知服务器使用用户代理的用户的电子邮件地址。

    Host:告知服务器,请求的资源所处的互联网主机名和端口号。必须被包含在请求内的首部字段。

    If-Match:附加条件请求,只有判断指定条件为真时,才会执行请求。服务器会对比If-Match字段值和资源的ETag值,仅当两者一致时,才会执行请求。反之则返回412 Precondition Failed的响应。

    If-Modified-Since:判断指定时间内服务器资源是否有更新,如有则服务器接受请求,如无则返回304Not Modified的响应。

    If-None-Match:指定If-None-Match字段值的实体标记ETag与请求资源的ETag不一致时,它就告知服务器处理该请求。

    If-Range:告知服务器返回范围内的资源,如未指定则返回全体资源

    If-Unmodified-Since:告知服务器指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果再指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回。

    Max-Forwards:服务器在往下一个服务器转发请求之前,Max-Forwards的值减1后重新赋值,当值为0时,则不再进行转发,而是直接返回响应。可以灵活使用它针对问题产生的原因展开调查,确定哪台服务器为重点传输路径。

    Proxy-Authorization:告知服务器认证所需要的信息,发生在客户端与代理之间。

    Range:只需获取部分资源的范围请求,如从第5001字节至第10000字节的资源。

    Referer:告知服务器请求的原始资源的URI

    TE:告知服务器客户端能够处理响应的传输编码方式及相对优先级。

    User-Agent:用于传达浏览器和用户代理名称等信息传达给服务器。

    6.7 响应首部字段

    概念:服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等

    Accept-Ranges:告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。

    Age:告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age。

    ETag:告知客户端实体标识,它是一种可将资源以字符串形式做唯一标识的方式,服务器会为每份资源分配对应的ETag。

    • 强ETag值:不论实体发生多么细微的变化都会改变其值。
    • 弱ETag值:只用于提示资源是否相同,只有资源发生了根本改变,产生差异时才会改变ETag值,这时会在字段最开始处附加W/。

    Location:可将响应接收方引导至某个与请求URI位置不同的资源。配合3xx: Redirection的响应,提供重定向的URI。

    Proxy-Authenticate:把由代理服务器所要求的认证信息发送给客户端。

    Retry-After:告知客户端应该在多久之后再次发送请求,配合503 Service Unavailable或3xx Redirect响应一起使用。

    Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

    Vary:当代理服务器接收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么久直接从缓存时返回响应。反之则需要先从源服务器端获取资源后才能作为响应返回。

    WWW-Authenticate:告知客户端适用于访问请求URI所指定资源的认证方案(Basic or Digest)和带参数提示的质询。

    6.8 实体首部字段

    概念:包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

    Allow:通知客户端能够支持Request-URI指定资源的所有HTTP方法。当服务器接收到不支持HTTP的方法时,会以状态码405 Method Not Allowed作为响应返回。还会把所有能支持的HTTP方法写入首部字段Allow后返回。

    Content-Encoding:告知服务器对实体的主题部分选用的内容编码方式(在不丢失实体信息的前提下所进行的压缩)。有gzip compress deflate identity

    Content-Language:告知客户端实体主体使用的自然语言。

    Content-Length:表明实体主体部分的大小。

    Content-Location:给出与报文主体部分相对应的URI。

    Content-MD5:是一串MD5算法生成的值,其目的在于检查报文主体在传输过程中是否把持完整,以及去人传输到位。

    Conntent-Range:告知客户端作为响应返回的实体的那个部分符合范围请求。字段值一字节为单位,表示当前发送部分及整个个实体大小。

    Content-Type:说明了实体主体内对象的媒体类型。用type/subtype形式赋值。

    Expires:将资源失效的日期告知客户端,在字段值指定的时间之前,响应的副本会一直被保存在缓存服务器,超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

    Last-Modified:指明资源最终修改的时间。

    6.9 为Cookie服务的首部字段

    作用:WEB网站为了管理用户的状态回通过WEB浏览器,把一些数据临时写入用户的计算机内,接着当用户访问该WEB网站时,可通过通信方式取回之前发放的COOKIE。调用COOKIE时,可校验COOKIE的有效期,以及发送方的域、路径、协议等信息,所以正规发布的COOKIE内的数据不会因来自其他WEB站点和攻击者的攻击而泄露。

    Set-Cookie

    概念:当服务器准备开始管理客户端的状态时,会事先告知各种信息。
    属性

    • expires:指定浏览器可发送COOKIE的有效期,当省略该属性时,有效期仅限于维持浏览器会话时间段内,通常限于浏览器应用程序被关闭之前。
    • path:将服务器上的文件目录作为COOKIE的适用对象。
    • domain:作为COOKIE适用对象的域名,不指定该属性显得更安全。
    • secure:限制web页面仅在HTTPS安全连接时,才可以发送cookie。当省略该属性时,不论HTTP还是HTTPS都会对COOKIE进行回收。
    • HttpOnly:使javaScript脚本无法获得Cookie,其主要目的为防止跨站脚本攻击对Cookie的信息窃取。

    Cookie:告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的COOKIE。接收到多个COOKIE时,同样可以以多个COOKIE形式发送。

    其他首部字段

    X-Frame-Options:用于控制网站内容在其他Web网站的Frame标签内的显示问题,其主要目的是为了防止点击劫持攻击。

    指定值

    • DENY:拒绝
    • SAMEORIGIN:仅同源域名下的页面匹配时许可

    X-XSS-Protection:针对跨站脚本攻击的一种对策,用于控制浏览器XSS防护机制的开关。

    • 值0:将XSS过滤设置成无效状态
    • 值1:将XSS过滤设置成有效状态

    DNT:拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。

    • 值0:同意被追踪
    • 值1:拒绝被追踪

    P3P:让WEB网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。


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

    BASIC认证

        步骤1:当请求的资源需要BASIC认真时,服务器会随状态码401返回带WWW-Authenticate首部字段的响应。该字段内包含认证的方式及Request-URI安全域字符串。
        步骤2:接收到状态码401的客户端为了通过BASIC认证,需要将用户ID及密码发送给服务器。发送的字符串内容是由用户ID和密码构成,两者中间以冒号连接后,再经过BASE64编码处理。
        步骤3:接收到包含首部字段Authorization请求的服务器,会对认证信息的正确性进行验证。如验证通过后,则返回一条包含Request-URI资源的响应。
        BASIC认证使用上不够便捷灵活,且达不到多数WEB网站期望的安全性等级,因此它并不常用。
    

    DIGEST认证

        步骤1:请求需认证的资源时,服务器会随着状态码401,返回带WWW-Authenticate首部字段的响应。该字段内包含质问响应方式认证所需的临时质询码。首部字段WWW-Authenticate内必须包含realm和nonce这两个字段的信息。nonce是一种每次随返回的401响应生产的任意随机字符串,该字符串通常推荐由BASE64编码的十六进制数组成。
        步骤2:接收到401状态码的客户端,返回的响应中包含DIGEST认真必须的首部字段Authenticate信息(username, realm, nonce, uri, response-经过MD5运算后的密码字符串形成响应码)。
        步骤3:接收到包含首部字段Authorization请求的服务器,会确认认证信息的正确性。认证通过后则返回包含Request-URI资源的响应。
        DIGEST认证安全等级高于BASIC但低于HTTPS,它提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
    

    SSL客户端认证

        SSL客户端认证时借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
        需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
        步骤1:接收到需要认真资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
        步骤2:用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。
        步骤3:服务器验证客户端证书验证通过后方可领取证书内客户端的公开秘钥,然后开始HTTPS加密通信。
        SSL客户端认证采用双因素认证:除了依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证来使用,就是证书+用户密码。
    

    基于表单认证

        - 认证多半为基于表单认证
        - Session管理及Cookie应用
            一般会使用Cookie来管理Session。
            步骤1:客户端把用户ID和密码等登录信息放入报文的实体部分,通常是以POST方法把请求发送给服务器。而这时,会使用HTTPS通信来进行HTML表单画面的显示和用户输入数据的发送。
            步骤2:服务器会发送以识别用户的Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID绑定后记录在服务端。(在首部字段Set-Cookie内写入SessionID、为减轻跨站脚本攻击XSS造成的损失,建议事先在Cookie内加上httponly属性)
            步骤3:客户端接收到服务器端发送来的SessionID后,会将其作为Cookie保存在本地。下次发送服务器请求时,浏览器会自动发送Cookie,所以Session ID也随之发送到服务器。服务器端通过验证Session ID识别用户和其认证状态。
            安全的保存方法是利用给密码加盐salt的方式增加额外信息,再使用散列hash函数计算出散列值后保存
            salt:由服务器随机生成的一个字符串,好处是就算使用了同一个密码,由于随机生成的salt值不同,对应的散列值也就不同,减少密码泄露的风险。
    

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

    消除HTTP瓶颈的SPDY

    解决HTTP的性能瓶颈,缩短WEB页面的加载时间(50%)

    HTTP的瓶颈

    举个微博的例子,如果使用HTTP协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认,如果服务器上没有内容更新,那么就会产生徒劳的通信。

    具体瓶颈

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

    解决方法

    • Ajax:核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信。借由这种手段,就能从已加载完毕的WEB页面上发起请求,只更新局部页面。缺点是可能导致大量请求的产生。
    • Comet:一旦服务器端有内容更新了,Comet不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能。缺点是为了维持连接会消耗更多的资源
    • 这两种方案,HTTP的瓶颈都仍然存在。

    SPDY

    SPDY没有完成改写HTTP协议,而是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作,同时考虑到安全性问题,SPDY规定通信中使用SSL。

    功能

    • 多路复用流
    • 赋予请求优先级
    • 压缩HTTP首部
    • 推送功能
    • 服务器提示功能

    缺点

    • 只将单个域名的通信多路复用
    • WEB网站导入该技术的进展不佳

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

    WEB浏览器与WEB服务器之间全双工通信标准,WebSocket协议由IETF定为标准,WebSocket API有W3C定为标准。主要为了解决AJAX和CONMET里XMLHttpRequest附带的缺陷所引起的问题。
    一旦WEB服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据。连接的发起方仍是客户端,一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。

    特点

    • 推送功能:支持服务器向客户端推送数据的推送功能,不必等待客户端请求。
    • 减少通信量:只要建立起WebSocket连接,就希望一直保持连接状态,而且WebSocket的首部信息很小,通信量也相应减少了。

    实现
    在HTTP连接建立后,需要完成一次“握手”的步骤

    • 握手-请求:需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手的目的。
    • 握手-响应:返回状态码101的响应。

    Web服务器管理文件的WebDAV

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


    第十一章 Web的攻击技术

    针对WEB的攻击技术

    HTTP不具备必要的安全功能,应用HTTP协议的服务器和客户端,以及运行在服务器上的WEB应用等资源才是攻击目标

    针对WEB应用的攻击模式

    • 以服务器为目标的主动攻击:通过直接访问WEB应用把攻击代码传入的攻击模式
      SQL注入攻击;
      OS命令注入攻击;
    • 以服务器为目标的被动攻击:利用圈套策略执行攻击代码的攻击模式
    1. 攻击者诱使用户触发已设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的HTTP请求。
    2. 用户不知不觉中招之后,用户的浏览器或邮件客户端就会触发这个陷阱
    3. 中招后的用户浏览器会把含有攻击代码的HTTP请求发送给作为攻击目标的WEB应用,运行攻击代码。
      4.执行完攻击代码,存在安全漏洞的WEB应用会成为攻击者的跳板,可能导致用户所持的Cookie等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。

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

    客户端的验证

    WEB应用端(服务器端)的验证

    • 输入值验证
    • 输出值转义

    跨脚本攻击

    概念:通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
    影响

    • 利用虚假输入表单片区用户个人信息
    • 窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意的请求
    • 显示伪造的文章或图片

    SQL注入攻击

    概念:针对WEB应用使用的数据库,通过运行非法的SQL而产生的攻击。
    影响:可能引发极大的威胁,有时会直接导致个人信息及机密信息的泄露。

    OS命令注入攻击

    概念:指通过WEB应用,执行非法的操作系统命令达到攻击的目的,只要在能调用SHELL函数的地方就有存在被攻击的风险。
    影响:OS命令注入攻击可以向SHELL发送命令,让WINDOWS或LINUX操作系统的命令行启动程序,也就是说,通过OS注入攻击可执行OS上安装着的各种程序。

    HTTP首部注入攻击

    概念:通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击,属于被动攻击模式。
    影响

    • 设置任何Cookie信息
    • 重定向至任意URL
    • 显示任意的主题(HTTP响应截断攻击)
      HTTP响应截断攻击

    邮件首部注入攻击

    WEB应用中的邮件发送功能,攻击者通过向邮件首部TO或Subject内任意添加非法内容发起的攻击。利用存在安全漏洞的WEB网站,可对任意邮件地址发送广告邮件或病毒邮件。
    方法:%0D%0A,一旦WEB应用接收了这个换行符,就可能实现对BCC邮件地址的追加发送

    目录遍历攻击

    对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。

    远程文件包含漏洞

    部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击。

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

    错误设置WEB服务器,或是由设计上的一些问题引起的安全漏洞。

    强制浏览:从安置在WEB服务器的公开目录下的文件中,浏览哪些原本非自愿公开的文件。

    影响

    • 泄露顾客的个人信息等重要情报
    • 泄露原本需要具有访问权限的用户才可查阅的信息内容
    • 泄露未外连到外界的文件

    不正确的错误消息处理

    • WEB应用的错误信息内包含对攻击者有用的信息
      WEB应用抛出的错误消息
      数据库等系统抛出的而错误消息

    • 集中在几个方面:
      PHP或ASP等脚本错误
      数据库或中间件的错误
      WEB服务器的错误

    • 开放重定向
      对指定的任意URL作重定向跳转的功能:访问A网站结果跳到了B网站

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

    管理用户状态的必备功能,但是如果再会话管理上有所疏忽,就会导致用户的认证状态呗窃取等后果。

    会话劫持

    通过某种手段拿到了用户的会话ID,并非法使用会话ID伪装成用户,达到攻击的目的。
    途径

    • 通过非正规的生产方法推测会话ID
    • 通过窃听或XSS攻击盗取会话ID
    • 通过会话固定攻击强行获取会话ID

    会话固定攻击

    对以窃取目标会话ID为主动攻击手段的会话劫持而已,会话固定攻击会强制用户使用攻击者指定的会话ID,属于被动攻击。
    攻击者访问登录页面,服务器返回一个会话ID,攻击者诱导用户前去认证,认证后攻击者用已认证的ID进行访问。

    跨站点请求伪造

    攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。

    影响

    • 利用已通过认证的用户权限更新设定信息等
    • 利用已通过认证的用户权限购买商品
    • 利用已通过认证的用户权限在留言板上发表言论

    其他安全漏洞

    密码破解

    通过网络的密码试错

    • 穷举法:用所有可行的候选密码对目标的密码系统试错
    • 字典攻击:利用事先收集好的候选密码(经过各种组合方式后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法。

    对已加密密码的破解

    • 把加密处理的密码还原成明文形式
    • 通过穷举法*字典攻击进行类推
    • 彩虹表:由明文密码及与之对应的散列构成的一张数据库表,是一种通过事先制作庞大的彩虹表,可在穷举法*字典攻击等实际破解过程中缩短消耗时间的技巧。从彩虹表内搜索散列值就可以推导出对应的明文密码。
    • 拿到秘钥
    • 加密算法的漏洞

    点击劫持

    利用透明的按钮或链接做成陷阱,覆盖在WEB页面上。

    DOS攻击

    运行中的服务呈停止状态的攻击,也叫服务停止攻击或拒绝服务攻击。
    两种方式

    • 集中利用访问请求造成资源过载,资源用尽的同事,实际上服务也就呈停止状态。
    • 通过攻击安全漏洞使服务停止。

    后门程序

    设置隐藏入口,可不按正常步骤使用受限功能,利用后门才能使用。
    3种类型

    • 开发阶段作为DEBUG调用的后门程序
    • 开发者为了自身利益植入的后门程序
    • 攻击者通过某种方法设置的后门程序

    相关文章

      网友评论

          本文标题:《图解HTTP》读书笔记

          本文链接:https://www.haomeiwen.com/subject/yzfvrqtx.html