《图解HTTP》笔记

图解HTTP

[日]上野 宣 著 于均良 译

由于上传md格式图片无法加载,有需要的可以去我的资源 下载。

文章目录

第1章 了解web及网络基础

1.1 使用http协议访问web
  • http协议是用来规范:客户端到服务器端的一系列运作流程。
1.2 HTTP的诞生
  • 最初设想:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的WWW。
  • 三项WWW构建技术
    1. 把SGML(Standard Generalized Markup Lanuage,标准通用标记语言)作为页面的文本标记语言的HTML(HyperText,超文本标记语言)
    2. 作为文档传递协议的HTTP
    3. 指定文档所在地址的URL(Uniform Resource Locator,统一资源定位符)
  • HTTP/1.0公布于1996年5月,HTTP/1.1公布于1997年1月。
1.3 网络基础TCP/IP
  • TCP/IP是互联网相关的各类协议族的总称,分为应用层、传输层、网络层、数据链路层。

  • 应用层

    预存了各类通用的应用服务,如FTP(File Transfer Protocol,文件传输协议)、DNS(Domain Name System,域名系统)、HTTP(HyperText Transfer Protocol, 超文本传输协议)等

  • 传输层

    提供网络之间的数据传输,有TCP( Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

  • 网络层

    处理在网络上流动的数据包,数据包是网络传输的最小数据单位。规定了传输路线(IP协议、路由转发协议等)。

  • 数据链路层

    处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理媒介。

1552546862682

1.4 与HTTP关系密切的协议:IP、TCP和DNS
  • IP

    IP(Internet Protocol,网际协议)位于网络层。

    IP地址指明系欸但被分配到的地址,MAC(Media Access Control Address)地址指网卡所属的固定全球地址。

    ARP(Address Resolution Protocol,地址解析协议)协议,根据通信方的IP地址可以查出对应的MAC地址。

  • TCP

    字节流服务(Byte Stream Service)指大块数据分割成以报文段(segment)为单位的数据包进行管理。

    三次握手:TCP标志SYN(synchronize)和ACK(acknowledgement),同步表示会等待对方的回应,ACK表示已经收到对方的信息。

1552547379896

1.5 负责域名解析的DNS服务
  • 主机名和域名。通过域名查找IP或者逆向查找。
1.6 各种协议与http协议的关系

1552547794919

1.7 URI和URL
  • URI(Uniform Resource Identifier,统一资源标识符)

    Uniform,规定统一的格式以处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式;加入新增的协议方案(如http:或ftp:)也更容易。

    Resource,“可识别的任何东西”,文档、图像、服务等。

    Identifier,可标识的对象,也称为标识符。

  • URI用字符串标识某一互联网资源,URL表示资源的地点,可见URL是URI的子集。

  • URI格式

    1552553265437

    • 协议方案名

      可选(有默认协议),使用http:或https:等协议方案名获取访问资源时要制定协议类型。也可使用data:或javascript:这类指定数据或脚本程序的方案名。

    • 登录信息(认证)

      可选,指定用户名和密码作为从服务器端获取资源时必要的登录信息。

    • 服务器地址

      必选,地址可以是DNS可解析的名称,或者192.168.1.1这类IPv4地址名,也可以是[0:0:0:0:0:0:0:1]这样用方括号括起来的IPv6地址名。

    • 服务器端口号

      可选,指定服务器连接的网络端口号,有默认端口号。

    • 带层次的文件路径

      可选。与UNIX系统的文件目录结构相似,有自动跳转的页面。

    • 查询字符串

      可选,针对指定资源传入查询字符串获得结果。

    • 片段标识符

      可选,标记出已获取资源中的子资源(文档中的某个位置),在RFC(Request for Comments,征求修正意见书)中没有明确规定使用方法。

第2章 简单的HTTP协议

本章使用HTTP/1.1讲述

2.1 HTTP协议用于客户端和服务器端之间的通信
  • HTTP协议能够明确区分客户端和服务器端。
2.2 通过请求和相应的交换达成通信
  • 请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。

1552554712745

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

    1552554971153

2.3 HTTP是不保存状态的协议
  • HTTP是无状态协议,对发送过的请求和响应都不做持久化处理。
  • 引入Cookies技术,可以管理状态。
2.4 请求URI定位资源

1552555171642

  • 对服务器本身发起请求,可以用一个*来代替请求URI。
2.5 告知服务器意图的HTTP方法
  • GET:获取资源

    如果请求文本则返回文本内容,如果请求CGI(Common Gateway Interface,通用网关接口)那样的程序(例如Jsp),则返回经过执行后的输出结果。

    1552555352330

  • POST:传输实体主体

    1552555429727

  • PUT:传输文件

    HTTP/1.1的PUT方法自身不带验证机制,存在安全性问题。一般配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准,才会开放PUT方法。

    1552555579737

  • HEAD:获得报文首部

    和GET一样,只是不返回报文主体部分。用于确认UPI的有效性和资源更新的日期时间等。

  • DELETE:删除文件

    与PUT相反的操作,也存在安全性问题。

  • OPTIONS:询问支持的方法

    1552556844766

  • TRACE:追踪路径

    让Web服务器端之前的请求通信环回给哭护短的方法。

    发送请求时,首部字段Max-Forwards规定了最大转发次数,没有到达服务器端则停止。客户端通过TRACE方法可以查询发送出去的请求是怎么样被加工、修改的、代理中转等信息。

    容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常不会用到。

  • CONNECT:要求用隧道协议连接代理

    要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

    1552557259217

2.6 使用方法下达命令

1552557313886

2.7 持久连接节省通信量
  • 持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse),只要任意一端没有明确提出断开连接,就保持TCP连接。HTTP/1.1之后默认使用持久连接。
  • 管线化(pipelining),持久连接使得多数请求以管线化方式发送称为可能,可以同时发送多个请求(异步方式)。
2.8 使用Cookies的状态管理
  • 通过叫做Set-Cookie的首部字段设置。

1552557714878

  • 由于服务器需要接受到Cookies才会检查,对比保存在服务器端的session,所以session机制可能需要借助于cookie机制来达到保存标识的目的。

1552558049417

1552558056221

第3章 HTTP报文内的HTTP信息

3.1 HTTP报文
  • 用于HTTP协议交互的信息,请求报文和响应报文。
  • 由报文首部、空行(CR+LF)、报文主体组成,不一定要有报文主体。
3.2 请求报文及响应报文的结构

1552558212594

3.3 编码提升传输速率
  • 报文(message),HTTP通信的基本单位,由8位组字节流(octet sequence)组成,通过HTTP传输。
  • 实体(entity),作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
  • 通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体内容发生变化,才导致它和报文主体产生差异。
  • 常见的内容编码:gzip(GNU zip)、compress(UNIX系统的标准压缩)、deflate(zlib)、identity(不进行编码)
  • 分块传输编码(Chunked Transfer Coding),将实体主体分成多个部分,每一个部分会用十六进制来标识块的大小,而实体主体的最后一块会使用“0+(CR+LF)”来标记。
3.4 发送多种数据的多部份对象集合
  • MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展),它允许邮件处理文本、图片、视频等多个不同类型的数据。
  • HTTP协议中也采纳了多部份对象集合。
  • multipart/form-data,Web表单文件上传时使用。

1552906201913

  • multipart/byteranges,状态码206(Partial Content,部分内容),响应报文包含了多个范围的内容时使用。

15529062442691552906251033

  • 在HTTP报文中使用多部份对象集合时,需要在首部字段里加上Content-type。使用boundary字符串来划分多部分对象集合指明的各类实体。
3.5 获取部分内容的范围请求
  • 范围请求(Range Request),可以指定范围发送的请求。用到首部字符按Range来指定资源的byte范围。

15529065452741552906550050

  • 针对范围请求,响应会返回状态码206 Partial Content的响应报文。对于多重范围的范围请求,响应会在首部字段Content-Type表明multipart/byteranges后返回响应报文。
  • 如果服务器无法响应范围请求,则返回状态码200 OK和完整的实体内容。
3.6 内容协商返回最合适的内容
  • 当浏览器的默认语言为英语或中文,访问相同的URI会现实是对应的英语版或中文版的Web网页。这种机制称为内容协商(Content Negotiation)。
  • 包含在请求报文中的某些首部字段就是协商的判断基准。如:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。
  • 内容协商技术有以下三种类型:
    1. 服务器驱动协商(Server-driven Negotiation),以请求的首部字段作参考,在服务器端自动处理。
    2. 客户端驱动协商(Agent-driven Negotiation),从浏览器现实的可选列表中手动选择。还可以利用JavaScript脚本在web页面上自动进行上述选择。比如按OS的类型或浏览器类型自动切换成PC版或手机版。
    3. 透明协商(Transparent Negotiation),服务器驱动和客户端驱动的结合体,各自进行内容协商。

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

4.1 状态码告知服务端返回的请求结果
状态码类别类型原因短语
1XXInformationl(信息性状态码)接受的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务端错误状态码)服务器处理请求出错
  • 遵守状态码类别的定义,即使服务器端自行创建状态码都没问题,常用的只有十几种。
4.2 2XX 成功
  • 200 OK,请求被正常处理。
  • 204 No Content,请求以成功处理,但在返回的响应报文中不含实体的主体部分,也不允许含有。一般在只需要上传信息而不需要对客户端发送新信息时使用。
  • 206 Partial Content,范围请求。
4.3 3XX 重定向
  • 301 Moved Permanently,永久性重定向。请求的资源被分配了新的URI,以后应使用资源现在所指的URI。例如URI中指定资源路径的最后忘记添加斜杠“/”,就会产生301状态码。http://example.com/sample

  • 302 Found,临时性重定向。仅本次使用新的URI访问。

  • 303 See Other,表示由于请求对应的资源存在着零一个URI,应使用GET方法定向获取请求的资源。比如,当使用POST方法防伪码CGI程序,其执行后的处理结果时希望客户端能以GET方法重定向到另一个URI上去,返回303状态码。

  • 当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

  • 304 Not Modified,未满足请求中的附加条件。

  • 307 Temporary Redirect,临时重定向。307遵照浏览器标准,不会从POST变成GET,但浏览器可能会有不同的处理。

4.4 4XX 客户端错误
  • 400 Bad Request,请求报文中存在语法错误。浏览器会像处理200 OK一样对待该状态码。
  • 401 Unauthorized, 表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息或者表示用户认证失败。返回401的响应必须包含一个适用于请求资源的WWW-Authenticate首部用以质询(challenge)用户信息。当浏览器初次接受到401响应,会弹出认证用的对话窗口。
  • 403 Forbidden, 请求被服务器拒绝。服务器可以在实体的主体部分对原因惊醒描述也可以不作申明。未获得文件系统的访问授权、访问全限出现问题(从未授权发送源IP地址试图访问)等情况可能发生403。
  • 404 Not Found,服务器上无法找到请求的资源。也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX服务器错误
  • 500 Internal Server Error,服务器执行请求时发生错误,可能时Web应用存在bug或某些临时故障。
  • 503 Service Unavailable,服务器暂时处于超负载或正在进行停机维护,暂时无法处理请求。如果知道解除以上情况所需的时间,可以写入Retry-After首部字段返回给客户端。

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

5.1 用单台虚拟主机实现多个域名
  • 虚拟主机(Virtual Host,或称为虚拟服务器),可以为一台物理服务器提供多个不同网站的服务器。
  • 在相同IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。
5.2 通信数据转发程序:代理、网关、隧道
  • 代理,基本行为是接受客户端发送的请求后转发给其他服务器,不改变请求URI,会直接发送给源服务器。从源服务器返回响应经过代理服务器再传给客户端。

    • 转发时,需要附加Via首部字段以标记经过的主机信息。

    1552972867978

    • 使用代理的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网络的访问控制,以获取访问日志为目的等。
    • 缓存代理(Caching Proxy),在转发响应时,会预先将资源的副本(缓存)在代理服务器上。当代理再次接受到相同资源的请求时,就可以不从源服务器里获取资源,而是将之前缓存的资源作为响应返回。
    • 透明代理(Transparent Proxy),不对报文做任何加工的代理类型被称为透明代理。反之称为非透明代理。
  • 网关,与代理相似,能使通信线路上的服务器提供非HTTP协议服务。

    • 能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密。
    • 比如,使用网关连接数据库、SQL语句查询、与信用卡结算系统联动等。
  • 隧道,确保客户端能与服务器进行安全的通信,本身时透明的,不会解析HTTP请求。

5.3 保存资源的缓存
  • 缓存服务器会向源服务器确认缓存资源的有效性,缓存的有效期限到期、客户端要求等因素,会使缓存服务器获取新资源。
  • 客户端可以就近从缓存服务器上获取资源,减少源服务器的IO压力和请求处理压力。
  • 缓存不仅可以存于缓存服务器,还可以存在客户端浏览器中。当判定缓存过期时也会获取新资源。

第6章 HTTP 首部

6.1 HTTP报文首部
  • HTTP请求报文,由方法、URI、HTTP版本、HTTP首部字段等部分构成。

1552973735344

15529737805651552973786075

  • HTTP响应报文,由HTTP 版本、状态码(数字和原因短语)、HTTP首部字段构成。

    1552973831525

    1552973840146

6.2 首部字段
  • 首部字段由首部字段名和字段值构成。

  • 首部出现重复的字段时,有的浏览器会优先处理第一次出现的,有的则会处理最后出现的字段。

  • 通用首部字段(General Header Fields),请求和响应通用。

  • 请求首部字段(Request Header Fields),请求的附加内容、客户端信息、响应内容相关优先级等信息。

  • 响应首部字段(Response Header Fields),响应的附加内容、对客户端额外要求的附加信息。

  • 实体首部字段(Entity Header Fields),资源内容更新时间等与实体有关的信息。

  • HTTP/1.1规范定义的47种首部字段。

1552974164993

1552974184963

15529741977811552974208827

1552974219596

  • 不限于RFC2616中定义的首部字段,还有Cookie、Set-Cookies和Content-Disposition等在其他RFC中定义的首部字段也经常使用。

  • End-to-end首部和Hop-by-hop首部,HTTP首部字段将定义成缓存代理和非缓存代理的行为。

    • 端到端首部(End-to-end),此类别中的首部会转发给请求/响应对应的最终接受目标,并且必须保存在由缓存生成的响应中,且必须被转发。

    • 逐跳首部(Hop-by-hop),此类别的首部指对单次转发有效,会因通过缓存或代理而不再转发,需提供Connection首部字段。

    • 逐跳首部字段有8个:Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade。其他所有字段都属于端到端首部。

6.3 HTTP/1.1通用首部字段
6.3.1 Cache-Control
  • Cache-Control,操作缓存的工作机制。指令参数可选,指令之间用逗号分隔。

    Cache-Control:private,max-age=0,no-cache

    15529777634651552977790164

    1552977803095

  • 表示是否能缓存的指令:public、private、no-cache(请求中包含时表示请求最新资源,响应中包含时表示该资源不能缓存,源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认)

    Cache-Control:no-cache=Location

    响应中包含该参数,则客户端接受到后不能使用缓存。无参数的首部字段可以使用缓存。只能在响应指令中指定该参数。

  • 控制可执行缓存的对象的指令:no-store,暗示请求或响应中包含机密信息,不能本地存储任一部分。(no-cache代表不缓存过期的资源,缓存会向源服务器尽心给有效期确认后处理资源)

  • 指定缓存期限和认证的指令:s-maxage(与max-age指令相似,s-maxage指令只适用于供多为用户使用的公共缓存服务器。)对向同一用户返回响应的服务器没用。当使用s-maxage指令后,直接忽略对Expires首部字段及max-age指令的处理。

  • max-age(单位:秒),当客户端发送的请求中包含max-age指令时,如果缓存资源的时间比max-age的数值更小,客户端就会接收,否则缓存服务器将请求转发给源服务器。当服务器返回max-age指令时,缓存服务器将不对资源的有效性再做确认,而是按照max-age的数值缓存资源。

1553142098954

  • min-fresh(单位:秒)指令,要求缓存服务器返回至少还未过指定时间的缓存资源。
  • max-stale(单位:秒)指令,指示缓存服务器即使过期也照常接收
  • only-ifcached指令,表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回(即缓存服务器不重新加载响应,也不确认资源的有效性)。若缓存无响应,返回504 Gateway Timeout。
  • must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效,会覆盖max-stale指令。若代理无法连通服务器再次获取资源,返回504 Gateway Timeout。
  • no-transform指令,规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型,防止压缩等操作。
  • cache-extension token,自定义的缓存服务器指令。
6.3.2 Connection
  • 具备两个作用:控制不再转发给代理的首部字段、管理持久连接。

1553144020255

  • Connection:不再转发的首部字段名,即Hop-by-hop首部。

1553144034203

  • Connection:close,明确表示断开连接(因为默认持久连接)。
  • Connection:Keep-Alive,HTTP/1.1前的版本,建立持久连接。
6.3.3 Date
  • 报文的创建日期和时间,使用RFC1123规定的格式。
Date: Tue, 03 Jul 2012 04:40:59 GMT
6.3.4 Pragma
  • HTTP/1.1之前版本的遗留字段,仅作为兼容作用。
Cache-Control: no-cache
Pragma: no-cache
6.3.5 Trailer
  • 事先说明报文主体记录的首部字段,可应用与分块传输编码。
6.3.6 Transfer-Encoding
  • 传输报文主体时采用的编码方式,进队分块传输编码有效。
6.3.7 Upgrade
  • 检测HTTP协议及其他协议是否可使用更高版本进行通信,参数值可指定一个通信协议。如果服务器支持该协议,则返回101 Switching Protocols。

1553147524959

6.3.8 Via
  • 追踪客户端与服务器之间的请求和响应报文的传输路径。
  • 报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。这种做法和traceroute及电子邮件的Received首部的工作机制类似。
  • 可以避免请求回环的发生。

1553148080304

  • 为了追踪传输路径,经常和TRACE方法一起使用。比如,代理服务器接收到由TRACE方法发送的亲求(其中Max-Forwards:0),代理服务器就不再转发,而将自身的信息附加到Via首部后返回该请求的响应。
6.3.9 Warning
  • 从HTTP/1,0中的Retry-After演变来的,告知用户一些与缓存相关的问题的警告。格式如下:

1553148404673

  • HTTP/1.1中定义了7中警告。

1553148429854

1553148441472

6.4 请求首部字段
  • 请求首部字段,用于补充请求地附加信息、客户端信息、对响应内容相关地优先级等内容。
6.4.1 Accept
  • 通知服务器,用户代理能够处理地媒体类型及媒体类型的相对优先级,可使用type/subtype这种形式指定多种类型。使用星号(*)作为通配符,可以指定任意的编码格式。

1553148622324

  • 几个媒体类型:
//文本文件
text/html,text/plain,text/css...
application/xhtml+xml,application/xml...
//图片文件
image/jpeg,image/gif,image/png...
//视频文件
video/mpeg,video/quicktime....
//应用程序使用的二进制文件
application/octet-stream,application/zip...
  • 使用q=来额外表示权重,用分号分隔。不指定权重时默认q=1。
6.4.2 Accept-Charset
  • 通知服务器,用户代理支持的字符集及字符集的相对优先顺序。

1553149154378

  • 几种内容编码:
    • gzip,由文件压缩程序gzip(GNU zip)生成的编码格式(RFC1952),采用Lempel-Ziv算法(LZ77)及32循环冗余校验(Cyclic Redundancy Check,通称CRC)。
    • compress,由UNIX文件压缩程序compress生成的编码格式,采用Lempel-Ziv-Welch算法(LZW)。
    • deflate,自核使用zlib格式及由defalte压缩算法生成的编码格式。
    • identity,不执行压缩的默认编码格式。
6.4.4 Accept-Language
  • 告知服务器,用户代理能够处理的自然语言集及相对优先级。

1553149445026

6.4.5 Authorizaion
  • 告知服务器,用户代理的认证信息(证书值)。

1553149481554

6.4.6 Expect
  • 告知服务器,期望出现的某种特定行为。服务器无法理解客户端的期望时,返回417 Expectation Failed。
  • 比如,等待状态码100响应的客户端在发生请求时,需要指定:Expect: 100-continue

1553149618028

6.4.8 Host
  • 告知服务器,请求的资源所处的互联网主机名和端口号。必须被包含在请求内(同个IP可以拥有不同域名)。若服务器未设定主机名,那直接发送一个空值即可。
6.4.9 If-Match
  • 告知服务器,匹配资源所用的实体标记(ETag)值。这时服务器无法使用弱ETag值。匹配失败,返回412 Precondition Failed。可使用通配符。

1553149836230

6.4.10 If-Modified-Since
  • 告知服务器,若If-Modified-Since字段值早于资源的更新时间,希望处理该请求。否则,返回304 Not Modified。

1553150556176

  • 获取资源的最新更新日期,可通过Last-Modidfied来确定。
6.4.11 If-None-Match
  • 指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,才处理请求。
  • 在GET或HEAD中使用 If-None-Match可获取最新资源。与If-Modified-Since类似。
6.4.12 If-Range
  • 告知服务器若指定的If-Range字段值(RTag值或时间)和请求资源的ETag值或时间值一致,则处理请求。反之,返回全体资源(最新资源)。
6.4.13 If-Unmodified-Since
  • 告知服务器只有在字段值内的日期时间之后未更新的情况下,才能处理。否则返回412 Precondition Failed。
6.4.14 Max-Forwards
  • 规定可经过的服务器最大数目,当值为0时,直接返回响应。
  • 避免由于未知原因(代理循环、代理服务器错误等),导致客户端收不到响应。
6.4.15 Proxy-Authorization
  • 接收到代理服务器的认证质询时,返回含Proxy-Authorization首部字段的请求,以告知服务器认证所需要的信息。

1553151320077

6.4.17 Referer
  • 告知服务器,请求的原始资源的URI(哪个页面发起的请求)。

1553151431625

6.4.18 TE
  • 告知服务器,客户端能够处理响应的传输编码方式及相对优先级。和Accept-Encoding相似,但用于传输编码。

1553151467010

  • 还可以指定伴随trailer字段的分块传输编码的方式。

1553151558280

6.4.19 User-Agent
  • 告知服务器,创建请求的浏览器和用户代理名称等信息。

1553151603317

6.5 响应首部字段
  • 补充响应的附加信息、服务器信息、对客户端的附加要求等。
6.5.1 Accept-Ranges
  • 告知客户端,服务器是否能处理范围请求,可接收设为bytes,反之为none。
6.5.2 Age
  • 告知客户端,源服务器在多久前创建了响应,单位:秒。
  • 若缓存服务器创建了该响应,必须加上Age,指缓存后的响应再次发起认证到认证完成的时间值。

1553152099935

6.5.3 ETag
  • 告知客户端,资源的实体标识,当资源更新时ETag的值也会更新。由服务器来分配。
  • 中文版资源与英文版资源ETag也不同。若在下载过程中出现连接中断、再连接的情况,无法依靠URI来确定资源是中文版还是英文版,会依照ETag来指定资源。
  • 强ETag值和弱ETag值。 强ETag值不论实体发生多么细微的变化都会改变值。弱ETag只用于实体资源是否相同。只有资源发生内容改变,才会改变ETag值,这时追在字段值前加W/。

1553152468417

6.5.4 Location
  • 将响应接收方引导至某个与请求URI位置不同的资源。基本上会配合3xx:Redirection进行重定向。
6.5.5 Proxy-Authenticate
  • 把由代理服务器所要求的认证信息发送给客户端。
6.5.6 Retry-After
  • 告知客户端多久之后再次发送请求,配合503 Service Unavailable响应或3xx Redirect响应一起使用。字段值可以是日期时间或秒数。
6.5.7 Server
  • 告知客户端,服务器上安装的HTTP服务器应用程序的信息,还可能包括版本号和安装时启用的可选项。

1553154211326

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

1553154392555

6.5.9 WWW-Authenticate
  • 告知客户端,适用于请求URI所指定资源的认证方案(Basic或Digest)和带参数提示的质询(challenge)。状态码401 Unauthorized响应中,肯定带有首部字段WWW-Authenticate。

1553154501796

6.6 实体首部字段
  • 补充内容的更新时间等与实体相关的信息。
6.6.1 Allow
  • 告知客户端,服务器能够支持Request-URI指定资源的所有HTTP方法。当服务i去接收到不支持的HTTP方法时,返回405 Method Not Allowed,并把所有支持的方法写入首部字段Allow中返回。
6.6.2 Content-Encoding
  • 告知客户端,服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息前提下进行的压缩。主要采取以下几种方式:
    • gzip
    • compress
    • deflate
    • indentity
6.6.3 Content-Language
  • 告知哭护短,实体主体使用的自然语言(zn-CN、en-us等)
6.6.4 Content-Length
  • 实体主体部分的大小。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段。
6.6.5 Content-Location
  • 给出与报文主体部分相对应的URI。与Location不同,Content-Location表示的是报文主体返回资源对应的URI。
  • 比如,对于使用首部字段Accept-Language的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段Content-Location内会写明URI。(访问http://www.hackr.jp/返回的对象确实http://www.hackr.jp/index-ja.html)
6.6.6 Content-MD5
  • 检查报文主体再传输过程中是否保持完整,以及确认传输到达。
  • 对报文主体齿形MD5算法获得的128位而基尼指数,再通过Base64编码后将结果写入Content-MD5字段值。为确保报文的有效性,作为接收方的客户端会对报文主体再执行一次相同的MD5算法,计算出的值与字段值作比较。
  • 由于Content-MD5可以重新计算然后篡改,所以无法识别报文是否经过篡改。
6.6.7 Content-Range
  • 针对范围请求,响应中使用Content-Range告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。

1553157225481

6.6.8 Conten-Type
  • 说明实体主体内对象的媒体类型,字段值用type/subtype形式复制。参数charset用sio-8859-1、euc-jp、utf-8等字符集进行赋值。
6.6.9 Expires
  • 将资源失效的日期告知客户端。缓存服务器再接收到含有首部字段Expires的响应后,会以缓存来应答请求。当超过Expires指定的时间,缓存服务器会直接转发请求给源服务器。
  • 再Expires字段内写入与Date相同的时间,可使缓存服务器不缓存该资源。
6.6.10 Last-Modified
  • 指明资源最终修改的时间。一般,这个值使Request-URI指定资源被修改的时间,但类似使用CGI脚本进行动态数据处理时,该值可能变成数据最终修改的时间。
6.7 为cookies服务的首部字段
  • Cookie的工作机制是用户识别及状态管理。调用Cookie时,由于可校验Cookie的有效期,以及发送方的域名、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击者的攻击而泄露。
  • 现在使用最广泛的是在网景公司指定的标准上进行扩展的产物。
6.7.1 Set-Cookie
  • 服务器准备开始管理客户端的状态时,会事先告知各种信息。

1553158435649

  • 有以下属性:
属性说明
NAME=VALUE赋予Cookie的名称和值(必需)
expires=DATECookie的有效期(默认浏览器关闭之前)
path=PATH将服务器上的文件目录作为Cookie的适用对象(默认为文档所在的文件目录)
domain=域名作为Cookie适用对象的域名(默认为创建该Cookie的服务器域名)
Secure仅在HTTPS通信时才会发送Cookie
HttpOnly该Cookie不能被JavaScript脚本访问
  • expires属性,一旦Cookie从服务器发送至客户端,服务器端就不存在显示删除Cookie的方法,可以通过覆盖操作进行删除。
  • path属性,可用于限制指定Cookie的发送范围的文件目录,不过并不能保证安全。
  • domain属性,结尾匹配。指定example.com时,www.example.com和www2.example.com都可以发送Cookie。除了针对具体指定的几个域名发送Cookie之外,不指定domain属性更安全。
  • secure属性,仅在HTTPS安全连接的情况下才会进行Cookie的回收。
  • HttpOnly属性,防止XSS攻击。
6.7.2 Cookie
  • 告知服务器,当客户端想获得HTTP状态管理支持,会砸i请求中包含从服务器接收到的Cookie。可以以多个Cookie形式发送。
6.8 其他首部字段
  • 可以扩展非标准的首部字段。
6.8.1 X-Frame-Options
  • 属于HTTP响应首部,控制网站内容在其他Web网站的Frame标签内的显示问题,防止点击劫持攻击。主流浏览器都支持。
  • 有两个可指定的字段值:
    • DENY:拒绝
    • SAMEORIGIN:仅同源域名下的页面(Top-level-browsin-context)匹配时许可。(其他域名下的frame不允许加载)
6.8.2 X-XSS-Protection
  • 控制浏览器XSS防护机制的开关,1为过滤XSS,0为关闭。
6.8.3 DNT
  • 属于HTTP请求首部,Do Not Arack的简称。1拒绝被追踪,0同意被追踪。
6.8.4 P3P
  • 属于HTTP响应首部,通过利用P3P(The Platform for Privacy Prefrences,在线隐私偏好平台)技术,让个人隐私变成一种仅供程序可理解的形式。

第7章 确保web安全的https

7.1 HTTP的缺点
  • 通信使用明文,内容可能会被窃听。

  • 通信加密,通过和SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容,称为HTTPs(HTTP Secure,超文本传输安全协议)。

  • 内容加密,要求哭护短和服务器同时具备加密和解密的机制。主要应用在Web服务中,但内容仍有被篡改的可能。

  • 不验证通信方的身份,因此可能遭遇伪装。

    • DoS(Denial of Servce,拒绝服务攻击)
    • 伪装的Web服务器、客户端
    • SSL提供证书。证书由值得信任的第三方机构颁发,在访问之间会验证证书的有效性。

    1552985683829

  • 无法证明报文的完整性,有可能遭篡改。

    • 中间人攻击(Man-in-the-Middle attack,MITM)。
    • 常用的是MD5和SHA-1等散列指校验的方法,以及用来确认文件的数字签名方法。提供文件下载服务的Web网站也会提供相应的以PGP(Pretty Good Privacy,完美隐私)创建的数字签名及MD5算法生成的散列值。
    • 需要客户端亲自检查验证下载的文件是否没有经过篡改,浏览器无法自动检查,且依然无法保证正确。因为PGP和MD5本身可以被改写。因此由必要使用HTTPS。
7.2 HTTP+加密+认证+完整性保护=HTTPS
  • 使用SSL,变成HTTP先和SSL通信,再由SSL和TCP通信。其他应用层协议如SMTP和Telnet也可以配合SSL使用。
  • 公开密钥加密(Public-key cryptography),加密算法公开,密钥保密。
    • 共享密钥加密(Common key crypto system),对称密钥加密。无法解决传输密钥的安全问题。
    • 公开密钥加密是非对称密钥加密,一把私钥一把公钥。用公钥加密,用私钥解密。
  • HTTPS采用混合加密机制,在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。

1552986989313

  • 为了证明收到的公开密钥就是原本预想的服务器发行的公开密钥,需要使用数字证书认证机构(CA,Certificate Authority)和其相关机关办法的公开密钥证书。
    1. 服务器提出公开密钥的申请。
    2. 数字证书认证机构对申请的公开密钥做数字签名,然后把公钥放入公钥证书绑定在一起。
    3. 服务器将公钥证书(数字证书或证书)发送给客户端。
    4. 接到证书的客户端可使用数字证书认证机构的公开密钥,对证书上的数字签名进行验证。(安全转交证书很重要,多数浏览器开发商会事先在内部植入常用认证机关的公开密钥)
    5. 客户端使用公钥对报文加密后发送。
    6. 服务器用私有密钥对报文解密。
  • 可证明组织真实性的EV SSL(Extended Validation SSL Certificate)证书。
  • 用以确认客户端的客户端证书,证明正在通信的客户端时预料之内的客户端。用户需要自行安装客户端证书,且证书是付费的(一般只有安全性极高的机构才用于特殊用途,支撑用户的证书费用)。
  • 如果使用OpenSSL这套开源程序,每个人都可以构建一套自己的认证机构,给自己办法服务器证书。
  • HTTPS安全通信机制

1552989009352

  1. 开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
  2. 服务器可进行SSL通信。在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件列表中筛选出来的。
  3. 服务器发送Certificate报文,包含公开密钥证书。
  4. 服务器通知SSL握手协商部分结束。
  5. 客户端以Client Key Exchange报文回应,报文(已用公钥加密)中包含通信加密使用的Pre-master secret的随机密码串。
  6. 客户端发送Change Cipher Spec报文,提醒服务器之后的通信会采用Pre-master secret密钥加密。
  7. 客户端发送Finished报文,包含连接至今全部报文的整体检验值。这次握手协商能否成功,要以服务器是否能够正确解密该报文作为判定标准。
  8. 服务器发送Change Cipher Spec报文。
  9. 服务器发送Finished报文。
  10. SSL建立完成。开始进行应用层协议的通信,即HTTP请求。
  11. HTTP响应。
  12. 客户端断开连接,发送close_notify报文。再发送TCP FIN报文来关闭与TCP的通信。
  • 应用层发送数据时会附加MAC(Message Authentication Code)的报文摘要,能够查知报文是否遭到篡改。

1552990815132

  • SSL的慢分两种,一种通信慢,一种指处理速度慢(CPU、内存等资源消耗多)。可以使用SSL加速器硬件(专用服务器)增加处理SSL的速度。

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

8.1 何为认证
  • 核对信息通常由:密码、动态令牌、数字证书、生物认证、IC卡等。
  • HTTP/1.1使用的认证方式:BASIC认证、DIGEST认证(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证),还有Windows统一认证等。
8.2 BASIC 认证

1552991156289

  • 用户ID和密码使用Base64编码,可以被窃听、盗取。且很多浏览器不能实现认证注销操作,所以并不常用。
8.3 DIGEST认证
  • 使用质询/响应的方式(challenge/response),但不会像BASIC认证那样直接发送铭文密码。

1552993072493

  • 使用另一方接收到的质询嘛计算生成响应码,将响应码返回给对方进行认证。

1552993120309

  • DIGEST认证的认证步骤
  1. 请求需认证的资源,服务器随着状态码401 Authorization Required,返回带WWW-Authenticate首部字段(包含质问响应方式认证所需的临时质询码)的响应。WWW-Authenticate首部字段必须包含realm和nonce这两个字段的信息。nonce是一种每次随返回的401响应生成的任意随机字符串,通常推荐由Base64编码的十六进制数的组成形式,但实际内容以来服务器的具体实现。
  2. 接收到401状态码的客户端,返回的响应中包含DIGEST认证必须的首部字段Authorization信息,包含username、realm、nonce、uri和response的字段信息。username是realm限定范围内可进行认证的用户名。uri(digest-uri)即Request-URI的值,但考虑到经代理转发后Request-URI的值可能被修改,因此会复制一份保存内uri内。response也可叫做Request-URI,存放经过MD5运算后的密码字符串,形成响应码。
  3. 接收到含Authorization字段请求的服务器,会确认认证信息的正确性。然后返回包含Request-URI资源的响应。并在首部字段Authentication-Info写入一些认证成功的相关信息。
  • DIGEST认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制,只比BASIC认证安全感一点,也不常用。
8.4 SSL客户端认证
  • 借由HTTPS的客户端证书完成认证的方式,服务器分发客户端证书给用户,客户端必须安装此证书。
  • 服务器发送Certificate Request报文;客户端选择要发送的证书,把证书信息以Client Certificate报文发送给服务器; 服务器验证客户端证书后领取证书内客户端的公钥,然后开始HTTPS加密通信。
  • 多数情况下,SSL客户端认证不会仅依靠证书完成认证,会和基于表单认证组合形成一种双因素认证(Two-factor authentication)来使用。
8.5 基于表单认证
  • 基于Cookie来管理Session(由于HTTP是无状态协议)。

1553052291211

  • 验证步骤
    1. 客户端把用户ID和密码等登录信息放入报文的实体部分,以POST方法把请求放给服务器。使用HTTPS通信来进行HTML表单画面的现实和用户输入数据的发送。
    2. 服务器发放识别用户的Session ID。把用户认证信息与Session ID绑定后记录在服务器端。向客户端发送包含Session ID的Cookie。为防止Session ID 被盗,Session ID应使用难以推测的字符串,且服务器也需要进行有效期的管理,保证其安全性。另外,为减轻跨站脚本攻击(XSS)造成的损失,建议事先为Cookie内家伙是那个httponly属性。
    3. 客户端把接收到的Sesson ID放入本地Cookie,下次向服务器发送请求时,自动发送Cookie。服务器通过验证接收到的Session ID识别用户和其认证状态。
  • 一种安全的保存方法:利用给密码加盐(salt),增加额外信息,再使用散列(hash)函数计算出散列值后保存。常用的明文密码保存方法可能导致密码泄露。

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

9.1 基于HTTP的协议
  • Web的用途多样化,由原本的传输HTML文档的协议,演化出如在线购物、社交网络服务、网页游戏、企业内部管理工具等。
  • 功能可通过Web引用和脚本程序实现,可性能上被HTTP协议限制,因此在HTTP基础上添加新的功能。
9.2 消除HTTP瓶颈的SPDY
  • Google在2010年发布了SPDY(speedy),旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间。

  • HTTP的瓶颈:一条连接上只可发送一个请求;请求只能从客户端开始;客户端不可以接收除响应外的指令;请求/响应首部未经压缩;每次互相发送相同的首部造成浪费;任意选择数据压缩格式。

  • Ajax(Asynchronous JavaScript and XML,异步JavaScript与XML技术)是一种有效利用JavaScript和DOM(Document Object Model,文档对象模型)的操作,以局部刷新web页面的异步通信手段。核心技术是XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信。

  • Comet的解决办法。一旦服务器由内容更新,Comet直接给客户端返回响应。通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。服务器处理完请求,先挂起,等由内容更新时再返回响应。

  • SPDY从协议层面上消除HTTP所遭遇的瓶颈。

    • SDPY再TCP/IP的应用层与传输层之间新加会话层,控制数据的流动。

    1553054579616

    • 多路复用流,通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求都再一条连接上完成。
    • 赋予请求优先级,给请求逐个分配优先级,解决带宽低时的响应慢问题。
    • 压缩HTTP首部,通信产生的数据包数量和发送的字节数更少。
    • 推送功能,支持服务器主动向客户端推送数据的功能。
    • 服务器提示功能,服务器提示客户端请求所需资源(通知新资源的存在)。
9.3 使用浏览器进行全双工通信的WebSocket
  • WebSocket,即Web浏览器与Web服务器之间全双工通信标准。WebSocket协议由IETF定为标准,由W3C制定API。
  • WebSocket协议通信连接,可以互相主动发送JSON、XML、HTML或图片等任意格式的数据。支持推送功能,WebSocket首部信息更少,且连接一直保持连接。
  • 握手 · 请求:实现WebSocket通信,需要用HTTP的Upgrade首部字段,通知服务器通信协议发生改变。Sec-WebSocket-Key字段记录键值,Sec-WebSocket-Protocol字段记录子协议。

1553055333589

  • 握手 · 响应:返回101 Switching Protocols 的响应。Sec-WebSocket-Accept的字段值由Sec-WebSocket-Key生成。

1553055505938

1553055511294

  • WebSocket连接建立后不再使用HTTP的数据帧,采用WebSocket的数据帧。

1553055597426

  • WebSocket API,可由JavaScript调用。

1553055637176

9.4 期盼已久的HTTP/2.0
  • HTTP/2.0的实现:SPDY、HTTP Speed+Mobility、Network-Friendly HTTP UPgrade等。
  • HTTP/2.0 的7项技术
技术实现方法
压缩SPDY
多路复用SPDY+Mobility
TLS义务化Speed+Mobility,Friendly
协商Speed+Mobility
客户端拉拽(Client Pull)/服务器推送(Server Push)Speed+Mobility
流量控制SPDY
WebSocketSpeed+Mobility
9.5 Web服务器管理文件的WebDAV
  • WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统,是HTTP/1.1的扩展协议。
  • 创建、删除、文件创建者管理、文件编辑过程控制、文件内容修改版本控制等功能。
  • 新增的概念:
    • 集合(Collection):统一管理多个资源。
    • 资源(Resource):把文件或集合称为资源。
    • 属性(Property):定义资源的属性,以键值对的格式。
    • 锁(Lock):把文件设置为无法编辑状态。
  • 新增的方法:
    • PROPFIND:获取属性
    • PROPPATCH:修改属性
    • MKCOL:创建集合
    • COPY:复制资源及属性
    • MOVE:移动资源
    • LOCK:资源加锁
    • UNLOCK:解锁
  • 新增的状态码:
    • 102 Processing:正正常处理请求
    • 207 Multi-Status:存在多种状态
    • 422 Unprocessible Entity:格式正确,内容有无
    • 423 Locked:资源已加锁
    • 424 Failed Dependency:处理与某请求关联的请求失败,因此不再维持以来关系
    • 507 Insufficient Storage:保存空间不足
  • 实例

1553064325997

1553064350291

1553064360065

第10章 构建Web内容的技术

10.1 HTML
  • HTML(HyperText Markup Language,超文本标记语言)
    • 超文本时一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本。
    • 标记语言是指通过在文档的某部分穿插特别的字符串标签(HTML标签,Tag),用来修饰文档的语言。
  • CSS(Cascading Style Sheets,层叠样式表)
    • 指定如何展示HTML内的各种元素,属于样式标准之一。让文档的结构和设计分离,达到解耦的目的。
10.2 动态HTML
  • 调用客户端脚本语言JavaScript,实现对HTML的Web页面的动态改造。利用DOM可指定任意的HTML元素。
10.3 Web应用
  • 通过Web提供功能的Web应用,分静态和动态。

  • 与Web服务器及程序写作的CGI(Common Gateway Interface,通用网关接口),指Web服务器在接收到客户端发送的请求后转发给程序的一组机制。CGI程序可能会对请求内容做出相应的动作,帮你如创建HTML等动态内容。

  • Servlet(Server+Applet,轻量级服务程序)是一种能在服务器上创建动态内容的程序,是Java的一个接口,属于JavaEE的一部分。

    • Servlet运行在与Web服务器相同的进程中(常驻于内存中),收到的负载比起每次处理请求都要启动一次的CGI更小。Servlet运行环境叫做Web容易或Servlet容器。

    1553065147638

10.4 数据发布的格式及语言
  • XML(eXtensible Markup Language,可扩展标记语言)是一种可按应用目标进行扩展的通用标记怨言。从SGML(Standard Generalized Markup Language,标准通用标记语言)简化而成,对数据的记录方式做了特殊处理。

  • RSS(简易信息聚合,也叫聚合内容)和Atom都是发布新闻或博客日志等更更新信息文档的格式的总称,都用到了XML。

  • JSON(JavaScript Object Notation)是一种以JavaScript(ECMAScript)的对象表示法为基础的轻量级数据标记语言。

第11章 Web的攻击技术

11.1 针对Web的攻击技术
  • 主要针对Web服务进行攻击,常见的有SQL注入攻击、XSS、phpMyAdmin等。
  • 在客户端篡改请求,在请求报文中加载攻击代码,通过URL查询字段或表单、HTTP首部、Cookie等途径把攻击代码传入。
  • 主动攻击,指攻击者通过直接访问Web应用,把攻击代码传入。代表性的攻击:SQL注入攻击和OS命令注入攻击。
  • 被动攻击,指利用圈套策略执行攻击代码的攻击模式。代表性的攻击:跨站脚本攻击和跨站点请求伪造。
    1. 攻击者诱使用户触发陷阱,陷阱会发送已嵌入攻击代码的HTTP请求。
    2. 当用户中招后,浏览器或邮件客户端会触发。
    3. 用户的浏览器会发送含攻击代码的HTTP请求到目标的Web应用,运行攻击代码。
    4. 执行完攻击代码,存在安全漏洞的Web应用会称为攻击者的跳板,可能导致用户所持的Cookie等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。
11.2 因输出值转义不完全引发的安全漏洞
  • Web应用的安全对策可分成:
    • 客户端的验证
    • Web应用端的验证:输入值验证、输出值转义
  • 一般采用JavaScript验证客户端数据。客户端允许篡改数据或关闭JavaScript,因此保留客户端验证只是为了尽早地辨识输入错误,起到提高UI体验得作用。
  • 输入值验证通常是检查是否符合系统业务逻辑得数值或检查字符串编码等预防对策。
  • 从数据库或文件系统、HTML、邮件等输出Web应用处理的数据之际,对输出做值转义处理是至关重要的安全策略。
  • 跨站脚本攻击,指通过存在漏洞的Web网站注册用户的浏览器运行非法的HTML标签或JavaScript进行的一种攻击。动态创建的HTML部分有可能隐藏着安全漏洞(在输入框输入<script>标签)。
    • 利用虚假输入表单骗取用户个人信息。
    • 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
    • 现实伪造的文章或图片。
  • 通过诱导用户点击带陷阱的URI。输入的信息会被直接发送给攻击者的网站。

1553066987200

1553067038892

  • 对用户Cookie的窃取攻击。

1553067132065

1553067137326

  • SQL注入攻击,指针对Web应用使用的数据库,运行非法的SQL而产生的攻击。常见的有:
    • 非法查看或篡改数据库内的数据
    • 规避认证
    • 执行和数据库服务器业务关联的程序等
  • SQL是用来操作关系型数据库管理系统(Relational DataBase Management System,RDBMS)的数据库语言。常见的关系数据库有:Oracle Database、Microsoft SQL Server、IBM DB2、MySQL和PostgreSQL等。
  • 通常,将用户提供的搜索字符串插入到SQL语句中,但直接插入可能导致SQL攻击。例如,在字符串后加上‘–,由于–之后的语句会被SQL语法视为注释,后面的条件被忽略了。

15530676055571553067614195

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

    • 表单内容处理核心代码,open函数会调用sendmail命令发送邮件,邮件地址即$adr的值。

    1553067848760

    • 攻击者将下面的值指定作为邮件地址

    1553067914011

    • 攻击效果,分号可以分割执行命令。

    1553067928012

  • HTTP注入攻击(HTTP Header Injection)指攻击者通过在响应首部字段插入换行,添加任意响应首部或主体的一种攻击,属于被动攻击模式。向首部主体内容添加内容的攻击,称为HTTP响应截断攻击(HTTP Response Splitting Attack)。常见影响:

    • 设置任何Cookie信息
    • 重定向至任意URL
    • 显示任意的主体(HTTP响应截断攻击)
  • %0D%0A代表HTTP报文中的换行符。攻击者可通过和会话固定攻击(攻击者指定会话ID)组合,伪装成用户。

    1553070100883

  • HTTP响应截断攻击,将两个%0D%0A%0D%0A并排插入字符串后发送,从而伪造首部主体。

1553070208347

利用这个攻击,可伪造Web页面,让用户输入个人信息从而达到盗取信息的目的。

1553070219392

  • 邮件首部注入攻击,指Web应用中的邮件发送功能,攻击者通过向邮件首部To或Subject内任意添加非法内容发起攻击,从而发送广告邮件或病毒邮件。

    1553070537162

    1553070499174

    • %0D%0A在邮件报文中代表换行符,一旦咨询表单的Web应用接收这个换行符,就可能实现对Bcc邮件地址的追加发送。
    • 两个连续的换行符可以篡改邮件文本内容并发送。篡改To或Subject等任意邮件首部同理。

    1553070577100

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

    • Web应用对文件处理时,由外部指定文件名的处理存在疏漏的话,用户可使用…/等相对路径定位到/etc/passed等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到。应该关闭指定对任意文件名的访问权限。

    1553070951619

    1553070943699

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

    • 主要时PHP存在的安全漏洞,对PHP的include或require来说,这是一种可通过设定,指定外部服务器的URL作为文件名的功能,PHP5.2.0之后默认该功能无效。应该控制对任意文件名的指定。
    • 通过查询字段形式指定文件名,并在脚本内include语句出读入该文件。

    15530712080641553071212894

    • 攻击者指定URL后,在外部服务器准备攻击脚本。通过system函数执行OS命令。

    1553071250395

    1553071257669

11.3 因设置或设计上的缺陷引发的安全漏洞
  • 强制浏览(Forced Browsing)安全漏洞,指从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。可能有以下影响:

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

    通过某些方法可以推测目标的URL:

    • 文件目录一览(通过指定文件目录名称,即可在文件一览中看到显示的文件名)
    • 容易推测的文件名及目录名(带数字、字母顺序)
    • 备份文件(软件自动生成的脚本、日志、备份文件)
    • 经认证才可显示的文件
  • 不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞,指Web应用的错误信息内包含对攻击者有用的信息。主要错误信息如下:

    • Web应用抛出的错误信息(只需要简单的认证成功或失败的信息即可)
    • 数据库等系统抛出的错误信息(SQL有关等数据库或中间件的错误信息、PHP或ASP等脚本错误、Web服务器的错误)

    各系统应对详细的错误信息进行音质设定,或使用自定义错误消息,项目分debug版本与release版本,避免某些错误信息给攻击者启发。

  • 开放重定向(Open Redirect)指对指定的任意URL作重定向跳转的功能。可信度高的Web网站如果开放重定功能,很可能被攻击者当作钓鱼攻击的跳板。

    1553071981945

    1553071989567

11.4 因会话管理疏忽引发的安全漏洞
  • 会话劫持(Session Hijack),指攻击者通过某种手段拿到用户的会话ID,伪装成该用户。有以下几种方法:

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

    攻击者在得知该Web网站存在可跨站攻击的安全漏洞后,设置好用JavaScript脚本调用document。cookie以窃取Cookie信息。

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

    1553073434242

    • 攻击者先拿到会话ID,此时会话ID仍未认证用户信息。
    • 攻击者让用户使用该会话ID去认证网站。
    • 网站认证该用户,并把该ID记录下来。
    • 攻击者用这个已知的会话ID去访问网站,伪装成用户。
  • Session Adoption,指PHP或ASP.NET能够接收处理未知会话ID的功能。恶意使用该功能,便可跳过获得会话ID的步骤,攻击者可私自创建会话ID并让强制用户使用该ID。

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

    • 更新设定信息
    • 购买商品
    • 在留言板上发表言论

    1553073844422

11.5 其他安全漏洞
  • 密码破解(Password Cracking),常见方式:密码试错,破解加密的密码(入侵系统,获取加密或散列处理的密码算法),SQL注入攻击逃避认证,XSS窃取密码信息等。

    • 密码试错

      • 穷举法(Brute-force Attack,又称暴力破解法),指对所有密钥集合构成的密钥空间(Keyspace)进行琼穷举。
      • 字典攻击,指事先收集好的候选密码(经过组合等方式存入字典),然后尝试。比如四位密码系统中,生日做密码的可能性很高,就将日期0101~1231保存入字典。
      • 利用别处泄露的ID和密码进行攻击,用户习惯使用同一套或几套用户名和密码,可以从其他Web网站(也可以制作钓鱼网站获得)已泄露的ID及密码列表进行攻击。
    • 对已加密的密码的破解,密码一般通过散列函数做散列处理或加盐的手段保存。推导明文通常有以下几种方法:

      1553079859127

      • 通过穷举法·字典攻击进行类推,尝试调用相同的散列函数加密候选密码,然后计算出散列值与目标散列值匹配,类推出密码。

      1553079988937

      • 彩虹表(Rainbow Table),由明文密码及与之对应的散列值构成的一张数据库表,是一种预先制作庞大的彩虹表。在Free Rainbow Tables 网站上公布的一张由大小写字母及数字全排列的1~8位字符串对应的MD5散列值构成的彩虹表,大小约1050Gb。

      1553080475893

      • 拿到密钥,共享密钥方式可能会泄露密钥。
      • 加密算法的漏洞,加密算法本身可能存在漏洞(Web开发者独立实现的加密算法)。
  • 点击劫持(Clickjacking),指利用透明的按钮或连接做成陷阱,覆盖Web页面上,又称界面伪装(UI Redressing)。

    • 在iframe页面使用透明可点击按钮,用透明层覆盖目标网站,使PLAY按钮与注销按钮的页面所在位置保持一致

    1553139910774

    <iframe id="target" src="http://sns.example.jp/leave" style="opacity:0;filter:alpha(opacity=0)"</iframe>
    <button style="position:sbsolte;top:100;left:100;z-index:-1">PLAY</button>
    
  • DoS攻击(Denial of Service attack)是一种让运行中的服务器呈停止状态的攻击,不仅限于Web网站,还包括网络设备及服务器等。

    • 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务会停止。
    • 通过攻击安全漏洞使服务停止。
    • 很难分辨DoS攻击请求和正常的请求,多台计算机发起DoS攻击称为DDoS(Distributed Denial of Service attack),通常利用那些感染病毒的计算机作为攻击者的攻击跳板。
  • 后门程序(Backdoor),指开发设置的隐藏入口,可不按正常步骤使用受限功能,分以下三种类型:

    • 开发阶段作为Debug调用 的后门程序
    • 开发者为了自身利益植入的后门程序
    • 攻击者通过某种方式设置的后门程序
  • 可通过监视进程和通信的状态发现后门程序,但设定在Web应用中的后门程序由于和正常使用时区别不大很发现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值