HTTP图解阅读笔记
✧( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )( •̀ ω •́ )✧
第一章 了解WEB及网络基础
网络基础 TCP/IP
1. TCP/IP 基本概念
协议: 计算机与网络设备相互通信,需要遵守同一规则,即为协议
TCP/IP: 一般是指一个以TCP、IP为代表的协议簇
TCP/IP 的重要特点: 分层管理
TCP/IP协议族按层次分为
1.应用层
作用:定义数据格式并按照对应的格式解读数据
一般包括 :HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登陆)、DNS(域名解析)以及许多其他协议
2.传输层
作用:保证数据传输的可靠性(TCP协议),给每个应用程序标识身份(UDP协议),实现端口到端口的通信。
一般包括: TCP与UDP协议
3.网络层
作用:定义网络地址、区分网段、子网内MAC寻址、对于不同子网的数据包进行路由。
一般包括:ICMP、IP、IGMP、ARP
4.链路层
作用:数据包从一个设备的网络层传输到另外一个设备的网络层的方法,或是一个~~~~虚拟专有网络~~~~(~~~~VPN~~~~)或者隧道(?——?)
一般包括:控制操作系统和操作系统硬件的设备驱动、NIC(网卡)、光纤等物理可见部分
TCP/IP 通信传输流
书图:
上图表示TCP/IP协议数据的封装和分用,简略地来说:发送端每通过一层会增加该层的首部,接收端每通过一层则删除该层的首部。
IP、TCP和DNS
IP
IP协议位于网络层,作用是根据源主机和目的主机的地址来传送数据。其中两个重要条件是:
1.IP地址:节点(计算机或交换机)被分配的地址 (可变换)
2.MAC地址: 与网卡绑定的地址。
ps:ARP协议可以通过IP地址反查出MAC地址
TCP
TCP协议位于传输层,提供可靠的字节流服务(指:将大块的数据分割成以报文段为单位的数据包进行管理)
TCP的三次握手策略
作用:准确无误的将数据送至目标处。
第一次握手:发送端发送一个带SYN标志的数据包给接受端
第二次握手:接收端接受到后,回传一个带有SYN/ACK的数据包表示确认
第三次握手:发送端再回传一个带ACK标志的数据包,表示握手结束。
PS :若在某个阶段莫名中断,TCP会再次以相同的顺序发相同的数据包。
DNS
DNS协议是位于应用层,提供域名到IP地址之间的解析服务(双向)。
相较于IP地址,域名易于被人类接受,用域名作为IP地址的助记符。
5.URI与URL
URL(统一资源定位符)
URL 为 Uniform Resource Locater 的缩写,是使用 Web浏览器等访问Web页面是输入的网页地址。
URI(统一资源标识符)
URI 为 Uniform Resource Identifier 的缩写,是由某个协议方案表示的资源的定位标识符。
格式:
协议方案名:指定协议类型,不区分大小写
登录信息(可选): 用户名和密码作为获取资源的必要信息
服务器地址:使用绝对URI必须指定待访问的服务器地址,名称可以是hack.jp这种DNS可解析的名称,或是192.168.1.1这类IPv4地址名,或是[0:0:0:0:0:0:0:1]这种方括号IPv6地址名.
服务器端口号(可选):指定服务器连接的网络端口号.
带层次的文件路径:指定服务器上的文件路径来定位特指的资源.
查询字符串(可选):针对已指定的文件路径内的资源,查询文件名称(?)
片段表示符(可选):可标记已获取资源中的子资源.
第二章 简单的HTTP协议
请求与响应
请求报文
构成:请求报文是由请求方法、请求URL、协议版本、可选的请求首部字和内容实体构成的。
响应报文
构成:响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态协议,其自身不具备保存之前发送过的请求或响应的功能
注意:可以使用Cookie 技术实现期望的保持状态功能
请求URI定位资源
HTTP协议使用URI定位互联网上的资源。
指定请求URI的方式:
图 :以 http://hackr\.jp/index\.htm作为请求的例子。
若是对服务器本身发起请求,可以用一个 * 来代替请求URL
例:
告知服务器意图的HTTP方法
GET :获取资源
作用 : 请求已被URI识别的资源(符合URI格式?)。若请求文本,则返回文本,若请求的是特殊程序,则返回执行后结果。
POST :传输实体主体
GET也能传输主体,但两者有区别。
区别:
+ GET一般用于 获取/查询 资源信息,而POST一般用于 更新 资源信息
+ GET提交请求的数据会附在URL之后(**提交的数据会在地址栏中显示出来 且 长度会有限制 **),POST提交把提交的数据放置在HTTP包的包体(Request body)中。
+ GET采用 只支持文本(ASCII字符),并且采用urlencode
POST 支持文本,采用urlencode,也支持二进制,能够用来传输文件
PUT:传输文件
作用 : HTTP/1.1 的 PUT方法不带验证机制,存在安全性问题
HEAD : 获得报文首部
作用 : 确认URI的有效性和资源更新的日期时间
DELETE : 删除文件
作用:按请求URI删除指定的资源,但存在和PUT方法一样的安全性问题
OPTIONS : 询问支持的方法
作用 : 查询针对请求URI指定的资源支持的方法
TRACE:追踪路径
作用 : 让Web服务器端将之前的请求通信环回给客户端
内容:在MAX-Forward中输入一个数值,每经一个服务器器端减一,为0时停止传输,最后收到的服务器返回200 OK的响应.(易引发XST攻击)
CONNECT:要求用隧道协议连接(*)
要求在于代理服务器通信时建立隧道,用隧道协议进行TCP通信.主要使用 SSL 与 TLS 加密后经网络隧道传输.
格式:
报文结构:
HTTP/1.0和HTTP/1.1支持的方法
持久连接
HTTP的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。发送时会造成无谓的TCP连接断开。
持久连接:
特点:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
管线化
作用: 一个请求发出后,不用等待响应就可直接发送下一个请求。
使用Cookie的状态管理
上文提到可用Cookie实现保持状态功能
简略地来讲:Cookie技术通过在请求响应报文中写入Cookie信息来控制客户端的状态。
一般步骤:
在客户端第一次连接到服务器时,服务器会在响应报文中添加一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。
第二次客户端向服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端接受后会对发送的Cookie值进行匹配,得到之前的状态信息
第三章 HTTP报文内的HTTP信息
HTTP报文
概念:用于HTTP协议交互的信息被称为HTTP报文。客户端的HTTP报文叫请求报文,服务器端的叫响应报文。
结构:大致可分为 报文首部 和 报文主体 ,用空行(CR+LF)来划分。
请求报文
结构:
实例:
请求行:包含用于请求的方法,请求**URI **和 HTTP版本
首部字段:包含请求的各种条件和属性的各类首部
PS:一般包含四种首部 : 通用首部、请求首部、响应首部、实体首部。
响应报文
结构:
实例:
状态行:包含表明响应结果的 状态码 , 原因短语 和 HTTP版本 。
首部字段同上。
编码提供传输速率
① 区分 报文主体 与 实体主体
报文 :是HTTP通信的中的基本单位,由8位组字节流组成
实体 :作为请求或响应的有效载荷数据被传输,其内容由 实体首部 和 实体主体 组成
HTTP报文的主体用于 传输请求或响应的实体主体。(一般在进行编码操作时产生差异)
② 压缩传输内容的内容编码
类似于ZIP压缩文件,HTTP中的内容编码也对实体信息进行压缩,接受的客户端会进行解码。
内容编码指指名在实体内容上的编码格式。
常用的内容编码有
gzip(GNZ zip)、compress(UNIX系统的标准压缩)、deflate(zilb)、identity(不进行编码)、(*)
③ 分割传送的分块传输编码
分块传输编码 能 把实体主体分块 ,例如 在传输大容量数据时。通过把数据分割成多块,能让服务器逐步显示网页
分块传输编码 分割出的数据块,每一块都用十六进制标记块的大小,而且最后一块会用“0(CR+LF)”来表示。
④ 发送多种数据的多部分对象集合
MIME机制 使允许邮件处理文本,图片等多个不同类型的数据。
MIME 来描述标记数据类型,在MIME扩展中使用一种叫 多部分对象集合 的方法 来容纳多份不同类型的数据
多部分对象集合的对象有:
multipart/from-data
该对象在Web 表单文件上传时使用.
multipart/byteranges
该对象在 状态码 206响应报文包含了多个范围时使用。
PS:
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
使用 boundary 字符串来划分多部分对象集合指名的各类实体。
例:
⑤ 获取部分内容的范围请求
范围请求: 指定范围发送的请求
执行范围请求时,用到首部字段Range来指定资源的byte范围
byte指定形式:
PS:针对范围请求,响应会返回状态码为206 Partial Content 的响应报文,若无法响应,则返回状态码 200 OK 和完整的实体内容。
⑥内容协商返回最合适的内容
简单的来说,就是服务器根据客户端的属性(如语言),提供给客户端最合适的资源。
内容协商技术有三种类型:
服务器驱动协商
服务端对网页的自动处理
客户端驱动协商
用户进行手动操作
透明协商
上面两者的结合
第四章 返回结果的HTTP状态码
简略地说:
2XX是成功状态码
3XX是重定向码,服务器需要进行特殊处理来应对请求
4XX表示客户端处发生错误
5XX表示服务器端发生错误
汇总
(“借鉴”了一下菜鸟上的汇总( ̄▽ ̄)“)
第五章 与HTTP协作的Web服务器
用单台虚拟主机实现多个域名
注意:即同一个IP下可以对应多个域名,所以在发送HTTP请求时,必须在 Host 首部内完整指定主机名或域名的URI。
通信数据转发程序:代理、网关、隧道
源服务器:拥有资源实体的源服务器。
代理
**代理 **是有转发功能的应用程序,接受转发请求与响应。
基本行为:接受请求后转发给其他服务器,不改变URI。(PS:在转发时,需要附加Via首部字段以标记处经过的主机信息)
代理一般按两种基准分类:是否使用缓存 和 是否修改报文
缓存代理:
代理转发响应时,缓存代理会将响应的副本作为缓存保存,当代理再次接受到相同资源的请求时,就可以不从源服务器获取资源,将缓存作为响应返回。
透明代理:
不对报文做任何加工的代理类型叫透明代理,反之叫非透明代理。
网关
网关 是转发其他服务器通信数据的服务器,可以对请求进行处理。
网关可以将HTTP请求转化为其他协议的通信,使通信线路上的服务器提供非HTTP服务。
隧道
隧道 在相距远的服务器和客户端间进行中转,确保其间进行按安全的通信(可使用 SSL等加密技术)
隧道不会解析HTTP请求,请求保持原样,在断开连接时结束。
保存资源的缓存
缓存服务器
代理服务器的一种,在转发服务器返回的响应时,会保留一份响应的副本。
作用: 利用缓存可避免多次从源服务器转发资源
PS:基于客户端要求因素,缓存服务器会向服务器检查是否更新缓存。
客户端缓存
客户端浏览器中也存在缓存,这种缓存称为 临时网络文件。(同样具有检查更新的特性)
第六章 HTTP首部
(第六章你好多(;´д`)ゞ)
HTTP报文首部
HTTP请求报文
请求中,HTTP报文由 方法、URI、HTTP版本、HTTP首部字段 等部分组成
HTTP响应报文
在响应中,HTTP报文由 HTTP版本、状态码、HTTP首部字段构成。
HTTP首部字段
HTTP首部字段用来传递报文主体大小等信息。
HTTP首部字段由 首部字段名 和 字段值 构成,用“:”隔开。
格式:首部字段名:字段值
四种HTTP首部字段类型
①通用首部字段
请求报文和响应报文都会使用的类型
字段一览:
Cache-Control字段
首部字段Cache-Control能够控制缓存的行为.
缓存请求指令一览:
缓存响应指令一览:
具体指令解释:
Public 指令
使用该指令时,明确表明其他用户也可利用缓存
Private 指令
执行该指令后,响应只以特定的用户作为对象.
No-cache 指令
该指令目的是 防止从缓存中返回过期的资源.
请求中包含,表示客户端不接收 缓存的资源.
响应中包含,表示缓存服务器不再对资源进行缓存.
若接收的首部字段中带参数值,如:
则,客户端不会对该资源进行缓存(有参不缓存.无参可缓存)
No-store 指令
该指令规定缓存不能在本地存储请求或响应的任意部分.
使用no-store指令的情况一般是请求或响应中包含机密信息
控制可执行缓存的对象的指令:
s-maxage指令
Max-age指令
请求包含max-age指令时,如果指定时间大于判定时间,客户端接收缓存的资源,当指定值为0时,缓存服务器通常要向服务器确认缓存.
响应包含max-age指令时,缓存服务器不进行比较,max-age的数值代表资源保存的最长时间.
S-maxage 与 max-age 指令的功能相同,但是s-maxage 指令只适用供多位用户使用的公共缓存服务器.
Min-fresh指令
该指令要求缓存服务器返回至少未过指定时间的缓存资源.(上表示过了60秒的资源不会进行返回)
Max-stale指令
用 max-stale 指示缓存资源,即使过期客户端也照常接收.
(若未指定参数值,那么无论经过多久,都会接受响应.若指定数值,处于指定的时间内才会被客户端接受)
Only-if-cached 指令
该指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才进行返回.
must-revalidate指令
该指令用来验证下一个响应缓存是否有效
Proxy-revalidate指令
该指令 要求所有缓存服务器在要返回缓存前检查其有效性
No-transform指令
该指令规定无论是请求还是响应中,缓存都不能改变实体主体的媒体类型.
Cache-Control 扩展
通过该指令标记,可以扩展Cache-Control 首部字段内的指令.
Conenction字段
作用:
控制不再转发给代理的首部字段(逐跳首部)
格式:
管理持久连接
格式:
维持持久连接
断开链接
Data字段
data字段表明船舰HTTP报文的日期与时间.
RFC1123中的格式(HTTP/1.1)
RFC850中的格式(HTTP/1.1前)
还有一种格式:
Pragma字段
该字段仅作为与HTTP/1.0的向后兼容而定义.
格式(例):
Trailer字段
trailer字段会事先说明在报文主体后记录了哪些首部字段.
Transfer-Encoding字段
该字段规定; 规定了传输报文主体时采用的编码方式.
Upgrade字段
该字段用来检测HTTP协议即其他协议是否可用更高的版本进行通信.
(对于该请求服务器科尔用 101 Switching Protocols状态码作为响应返回)
Via字段
使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径,
Warning字段
该字段通常会告诉用户一些与缓存相关的问题的警告.
格式:
HTTP/1.1 警告码
②请求首部字段名
从客户端向服务器端发送报文时使用的首部
字段一览:
Accept字段
Accpet首部字段可通知服务器用户代理能够处理的媒体类型即其相对优先级。
形式:type/subtype
例
增加优先级,使用q=来表示权重值;用分号进行分割;q范围为0~1;首先返回权重级高的媒体类型。
Accept-Charset字段
该字段用来通知服务器用户代理支持的字符集及其的相对优先顺序,且 可以一次指定多种字符集。
例
Accept-Encoding字段
该字段用来告知服务器用户代理支持的内容编码及其优先级,可一次指定多种内容编码。
Accept-language字段
该字段用来告知服务器用户代理能够处理的自然语言及其优先级,可一次指定多种自然语言集。(无指定自然语言集,返回默认的)
Authorization字段
该字段用来告知服务器用户代理的认证信息。
Expect字段(*)
该字段告知服务器,期望出现某种特定行为,若服务器无法理解,则返回417状态码。
From字段
该字段用来告知服务器使用用户代理 的用户的电子邮件地址。(可能因代理不同,电子邮箱也会被记录在User-Agent首部字段中)
Host字段
该字段告诉服务器,请求的资源所处的互联网主机名和端口号。
该字段是在HTTP/1.1内唯一一个必须被包含在请求内的首部字段。
Host字段与 单台服务器分配多个域名有重要联系。
若服务器未设定主机名。则直接发送一个空值。
If-watch字段
形如If-xxx这种样式的请求首部字段,称称为条件请求。服务器接收附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since字段
该字段告知服务器若If-Modified-Since 字段值早于资源更新的时间。则希望能处理该请求,若在其后,则返回状态码 304 Not Found。
If-None-Match字段
该字段与If-Match作用相同,实现原理相反。
If-Range字段
该字段告知服务器若指定的的If-Range字段值和请求资源的ETag值或时间相等,则作为范围请求处理,反之,返回全体资源。
If-Unmodified-Since字段
该字段与If-Modified-Since作用相同,实现原理相反。
Max-Forwards字段
每经过一次转发,数值减一,为零时返回响应。
一般通过 TRACE 和 OPTIONS 方法包含Max-Forward 字段
Proxy-Authorization字段
该字段包含的信息用于告知服务器认证所需信息。
Range字段
获取部分资源的范围请求
Referer字段
该字段会告知服务器请求的原始资源的URI
(一般处于安全性考虑,不发送此字段)
嗯哼哼?
TE字段
该字段会告知服务器客户端能够处理响应的传输编码方式及相对优先级,类似于Accept-Encoding。
除此之外,该字段可以指定伴随tralier字段的分块传输编码方式。
应用方式:
③响应首部字段
从服务器端向客户端返回报文时使用的首部
字段一览:
Accept-Ranges字段
该字段用来告知客户端服务器是否能处理范围请求。
Age字段
该字段能告诉客户端,源服务器是在多久前创建的响应,字段值为秒。
若创建该响应的是缓存服务器,Age是指缓存后的响应发起认证到认证完成的时间值,代理创建响应时必须带上字段Age
ETag字段
该字段可以告知客户端实体标识。是一种可将资源以字符串形式做唯一性标识的方式。
当资源更新时,ETag值也需更新。
强ETag值
实体发生任何变化都会改变其值。
弱ETag值
只用于提示资源是否相同,会在字段开始处加 W 来区分。
Location字段
使用该字段可做重定向的工作,将响应接收方引导只与请求URI位置不同的资源。
通常与 3xx :Redirection 的响应配合。
Proxy-Authenticate字段
该字段会把代理服务器要求的认证信息发送给客户端。
Retry-After字段
该字段告知客户端应在多久后再次发送请求,主要配合 状态码503 Sever Unavailable或 3xx Redirt响应使用
字段值可以为 具体时间日期 或 创建响应后的秒数。
Sever字段
该字段告知当前服务器上安装的HTTP服务器应用程序等各类信息
Vary字段
该字段可对缓存进行控制,源服务器会向代理服务器传达本地缓存使用方法的命令。也就是说,若Vary后首部字段相同,则返回缓存,若不同,则访问源服务器。
WWW-Authenticate字段
该字段用于HTTP访问认证
例:
该字段包含 认证的方式(basic) 及 Reequest-URI安全域字符串(realm)
④实体首部字段
针对报文的实体部分使用的首部
字段一览:
Allow字段
该字段用于通知客户端能够支持Request-URI指定资源的所有HTTP方法,
当服务器接受到不支持的HTTP方法时,返回 405 状态码 和 同时吧所有能支持的方法写入 Allow 内
Content-Encoding字段
该字段会告诉客户端服务器对实体的主体部分的内容编码方式。
Content-language字段
该字段会告诉客户端对实体的主体部分的自然语言
Content-Length
该字段表明了实体主体部分的大小(单位:字节)
Content-Location字段
该字段给出与报文主体部分相对应的URI。
与Location不同,表示的是报文主体返回资源对应的URI
Content-MD5字段
该字段的字段值是 一串由MD算法生成的值,用于检测报文主体在传输过程中是否保持完整,及确认传输到达。
接受的客户端会重新执行一遍相同的MD5算法,来作比较检测。
Content-Range字段
该字段告知客户端响应中的实体部分的那个部分符合范围请求,及其整个实体大小。
Content-Type字段
说明了实体主体内对象的媒体类型。
Expires字段
该字段会将资源失效的日期告诉客户端。
若不希望资源被缓存,则在字段值内写入与 Date 相同的值。
当有max-age指令时,先处理max-age指令。
Last-Modified字段
该字段指明资源最终修改的时间。
非HTTP/1.1首部字段
不限于上述字段,还有 Cookie , Set-Cookie 等其他在RFC中定义的首部字段.
为Cookie服务的首部字段
Set-Cookie字段
当服务器开始管理客户端状态时,会事先告诉各种信息。
各属性:
expires属性
指定浏览器可发送Cokie的有效期。
若被省略,增有效期默认在浏览器关闭之前。
服务器端没有显示删除Cookie的方法,只能覆盖已过期的Cookie来达到目的。
Path属性
可以限定Cookie发送范围的文件目录,但可以绕过
domain属性
Cookie适用的域名,不指定为好(更安全)
Secure 属性
限制只能在 HTTPS下才能发送Cookie
HttpOnly属性
主要目的是 防XSS攻击。使得JS无法读取Cookie内容。
Cookie字段
就是客户端为得到保持状态功能,而发送给服务器的Cookie。
X-Frame-Options字段
属于响应首部,能控制网站内容在其他网站的Frame标签的显示
目的是防止点击劫持攻击。
字段值:
DENY:拒绝
SAMEORIGIN:仅允许同源域名下的页面匹配时许可。
X-XSS-Protection字段
属于响应首部,用来防止XSS攻击。
字段值:
0 : 将XSS过滤设置为无效状态。
1 :将XSS过滤设置成有效状态。
DNT字段
属于请求首部,用来拒绝个人信息被收集。
字段值:
0 :同意被追踪
1 :拒绝被追踪
P3P字段(*)
属于响应首部,利用P3P技术可以让网站上的个人隐私变成供程序理解的形式,来保护用户隐私
端对端首部 和 逐跳首部
端对端首部(缓存代理)“End to End”
在整个传输过程中会保持不变,必须保存在缓存中且必须转发
逐跳首部(非缓存代理)“Hop-by-hop”
只在单次转发中有效,会因通过缓存或代理而不再转发
除下列八个字段,其他所有字段属于端到端首部
• Connection
• Keep-Alive
• Proxy-Authenticate
• Proxy-Authorization
• Trailer
• TE
• Transfer-Encoding
• Upgrade
第八章 确认访问用户身份的认证
HTTP使用的认证方式
HTTP/1.1
BASIC认证(基本认证)
DIGEST认证(摘要认证)
SSL客户端认证
FormBase认证(基于表单认证)
BASIC认证
步骤概图
请求资源需要BASIC认证时,服务器会随状态码401,返回带WWW-Authorization Required首部字段的响应。
接收响应后,客户端发送Authorization字段,该字段中写入经过base64 编码 的用户ID与密码
DIGSET认证
PS:
nounce值是一种由Base64编码的十六进制的组成形式,实际内容以来服务器的具体实现。
REspone值为经过MD5运算的密码
SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问客户端。
认证步骤
步骤一:接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。
步骤二:用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
例
步骤三:
服务器验证客户端证书验证通过后,可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
双因素认证:
一般,SSL客户端不会仅靠证书完成认证,一般会和表单认证组合形成一种双因素认证。
基于表单认证
该认证方法不是在HHTP协议中定义的。
客户端向服务器的上的Web程序发送登录信息,按登录信息的验证结果认证。
Session管理及 Cookie管理
一般使用Cookie来管理会话
PS:
客户端一般使用POST方法把请求发送给服务器,这时会使用HTTPS通信来进行HTML表单画面的显示和用户输入数据的发送.
服务器会发放用以识别用户的Session ID , 通过验证从客户端发送过来的登录信息进行身份认证 , 然后把用户的认证状态与session ID 绑定后记录在服务器端.
客户端接收到发来的 Session ID后,会将其作为Cookie保存在本地,供下次访问使用.
第九章 基于HTTP功能追加协议
HTTP的初始创造目的时当作传输HTML文档的协议.但不能满足如今更加多样化的需求(食大便了,带人),因此需要额外添加新功能.
Ajax的解决方法
Ajax(Asynchronous JavaScript and XML)异步JavaScript 与 XML技术,是一种有效利用 JavaScript 和DOM 的操作,以达到局部Web页面替换加载异步通信手段.
由于只更新局部页面,响应中传输的数据量会因此而减少.
Comet的解决方法
每当服务器有内容更新,Comet不会让请求等待,直接返回响应,.是一种通过延迟应答,模拟实现服务器的端详客户端推送的功能.
Comet会将响应置于挂起状态,当服务器有内容更新时,再返回该响应
内容上虽然可以做到实时更新,但为了保留响应.一次连接的持续时间也会变长,为了维持连接会消耗更多的资源.
SPDY协议
Google发布了SODT,其开发目标旨在解决HTTP的性能瓶颈.
SPDY的设计与功能
SPDY是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作.并且SPDY规定在通信中使用SSL
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立连接,因此可兼容HTTP功能.
使用SPDY后,HTTP新增功能
- 多路复用流
通过单一的TCP连接可以无限制处理多个HTTP请求.
- 赋予请求优先级
可以给请求诸葛分配优先级顺序,主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题
- 压缩HTTP首部
压缩HTTP请求与首部,通信发送的字节数变少.
- 推送功能
支持服务器主动向客户端推送数据的功能.
- 服务器提示功能
服务器可以主动提示客户端请求所需的资源,可以避免不必要的请求.
使用浏览器进行全双工通信的WebSockt
WebSocket ,Web浏览器之间的全双工通信标准.开发目的是为了解决Ajax 和 Comet 里XMLHttpRequest 附带的问题
Websocket的主要特点
建立在HTTP基础上的协议
无论是服务器还是客户端,任意一方都可直接向对方发送报文
推送功能
支持服务器主动向客户端推送数据的功能.
减少通信量
Websockker连接建立后,会一直保持连接状态,但更优于HTTP连接
Websocket握手
为了实现Websocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,达到握手的目的
- 握手~请求
Sec-WebSocket-Key 字段 记录着握手过程中的键值
Sec-WebSocket-Protocol 字段 记录使用的子协议
子协议按WebSocket 协议标准在连接分开时使用,定义那些连接的名称
- 握手~响应
Sec-WebSocket-Accept 的字段值是由 握手请求中的Sec-WebSocket-Key的字段值生成的.
- 成功握手后,不再使用HTTP的数据帧,采用WebSocket独立的数据帧
WebSocket API(*)
JS可调用 **The WebSocket API **内提供的 WebSocket程序接口,实现WebSocket协议下全双工通信
例
Web服务器管理文件的WebDAV
WebDAV是一个可对Web服务器上的内容直接进行文件复制,编辑等操作的分布式文件系统.作为扩展HTTP/1.1的协议定义在RFC4918
除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能.
扩展HTTP/1.1的WebDAV
针对服务器上的资源,新增了一些概念
集合(Collection):是一种统一管理多个资源的概念。以集合为 单位可进行各种操作。也可实现类似集合的集合这样的叠加。
资源(Resource):把文件或集合称为资源。
属性(Property):定义资源的属性。定义以“名称 = 值”的格式执
行。锁(Lock):把文件设置成无法编辑状态。多人同时编辑时,可 防止在同一时间进行内容写入。
WebDAV内新增的方法及其状态码
PROPFIND :获取属性
PROPPATCH :修改属性
**MKCOL **:创建集合
**COPY **:复制资源及属性
MOVE :移动资源
LOCK :资源加锁
UNLOCK :资源解锁为配合扩展的方法,状态码也随之扩展。
102 Processing :可正常处理请求,但目前是处理中状态
207 Multi-Status :存在多种状态
422 Unprocessible Entity :格式正确,内容有误
423 Locked :资源已被加锁
424 Failed Dependency :处理与某请求关联的请求失败,因此不再维持依赖关系
507 Insufficient Storage :保存空间不足
WebDAV的请求与响应实例
使用PROFIND方法发起的请求
与之对应的响应
第十章 构建Web内容的技术
HTML
HTML是为了发送web上的超文本而开发的标记语言。
由HTML构成的文档经过浏览器的解析、渲染后,呈现出来的结果就是web页面
设计应用CSS
CSS可以指定如何展现HTML内地各种元素,属于样式表标准之一
可在选择器(sekector).logo的指定范围内,使用{}括起来的声明块中写明的padding:20px等声明语句应用指定的样式。
动态HTML(*)
动态HTML。是指时使用客户端脚本语言将静态HTML内容变成动态的技术的总称。
该技术是通过调用客户端脚本语言JS,实现对HTML的Web页面的动态改造,利用DOM可指定欲发生动态变化的HTML元素。
更易控制的HTML和DOM
DOM是用以操作HTML文档和XML文档的API。
通过调用JS等脚本语言对DOM的操作,可更加方便控制HTML。
例:
通过JS可以改变第三个P元素的文字颜色
Web应用
Web应用是指通过Web功能提供的应用程序。
将类似于程序创建的内容称为动态内容。事先准备好的内容称为静态内容
Web应用作用于动态内容之上
CGI
CGI(Common Gateway Interface)通用网关接口,是指web服务器在接收到客户端发送的请求后转发给程序的一组机制。
CGI能作用程序,使其对请求内容做出相应的动作,如创建HTML等动态内容
使用CGI的程序叫 CGI程序 。
缺点:由于在每次接到请求后程序都要跟着启动一次,一旦访问量过大,Web服务器要承载很大的负载.
Servlet
Servlet 是一种能在服务器上创建动态内容的程序,是用Java语言实现的一个接口,属于面向企业级Java的一部分.
Servlet运行在与web服务器相同的进程中,受到的负载较小,Servlet运行环境叫Web容器或Servlet容器,可以缓解CGI的缺点.
数据发布的格式及语言
XML
XML (eXtensible Markup Language)可扩展标记语言,是一种可按应用目标进行扩展的通用标记语言.
XML 和 HTML 都是从标准通用标记语言SGML简化而成,相较于HTML,对数据的处理方式做了特殊处理.
例:
HTML文档遇到不同的应用格式会不同,不适合记录数据结构,用XML改写
XML的结构基本是用标签分割成的树形结构,通过语法分析器(parser)的解析功能可以解析出XML结构并得到数据元素.
RSS/Atom
RSS(简易信息聚合/聚合内容)和Atom 都是发布新闻或博客日志等更新信息文档的格式的总称.都用到了XML.
例
JSON
JSON(JavaScript Object Notation)是一种以JS的对象表示法为基础的轻量级数据标记语言.
能处理的数据类型** false/null/true/对象/数组/数字/字符串** 七种.
让数据更轻更纯粹......
第十一章 Web的攻击技术
针对web的攻击技术
HTTP协议本身不具备必要的安全功能,应用HTTP协议的服务器和客户端,以及运行在服务器上的Web
应用等资源是攻击目标。
在客户端可篡改请求
在HTTP请求报文内加载攻击代码,就能发起对Web应用的攻击。通过 URL查询字段或表单,HTTP首部、Cookie等途径可传入攻击代码。
针对web应用的攻击模式
主动攻击
- 以服务器为目标的主动攻击
主动攻击 是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式,攻击者需要访问到服务器上的资源。
被动攻击
- 以服务器为目标的被动攻击
被动攻击 是指利用圈套策略执行攻击代码的攻击模式。攻击者不直接对目标Web应用访问发起攻击。
具有代表性的攻击 跨站脚本攻击 和 跨站点请求伪造
利用用户身份攻击企业内部网络
因输出值转义不完全引发的安全漏洞
实施Web应用的安全对策可大致分为以下两部分
客户端的验证
服务器端的验证
输入值验证
输出值转义
输入值验证通常是指检查是否是符合系统工业逻辑的数值或检查的字符编码等预防对策。
当输出值转义不完全时,会因触攻击者传入的攻击代码,而给输出对象带来损害
跨站脚本攻击(XSS)
跨站脚本攻击(XSS),是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击 。 动态创建的HTML部分有可能隐藏着安全漏洞。
XSS一般会有以下手段
利用虚假输入表单骗取用户个人信息。
利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下, 帮助攻击者发送恶意请求。
显示伪造的文章或图片
案例:(在动态生成HTML处发生)
像这样一个页面,在姓名一栏输入了 <s> 标签,浏览器会将其解析成HTML标签.利用此原理, 使用script标签可以发动攻击
如
通过地址栏中URI的查询字段指定ID,即相当于在表单内自动填写字符串的功能,于是我们可以利用这点来创建嵌入恶意代码的URL
浏览器打开该URI后,直观上没有发生变化,但脚本已经开始运行了,用户输入的ID与密码会直接发送到攻击者的网站.
利用类似方式,还可以窃取到用户的Cookie值.
SQL注入攻击
SQL注入是针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击.
一般会有以下手段
非法查看或篡改数据库内的数据
规避认证
执行和数据库服务器业务关联的程序等
攻击实例
这样一个购物网站
正常操作
可见flag=1为可显示条件,flag=0为隐藏内容.但是我们可以在地址栏进行改写,加上 -- ,and flag=1 会被忽略掉.
可令原本被隐藏的书籍显示出来.
OS命令注入攻击
OS命令注入攻击
OS命令注入攻击(OS Command Injection) 是指通过Web应用,执行非法的操作系统命令达到攻击的目的.(通过Shell函数)
在Web应用调用Shell时存在疏漏时,可执行插入的OS命令.
攻击实例:
该网页是发送邮件功能
在该表单的源代码中,有
插入
在OS命令中,会被解析为分隔多个执行命令的标记.
于是,在分隔后,sendmail命令会执行插入的命令,从而窃取账户信息.
HTTP首部注入攻击
HTTP首部注入攻击(HTTP Header Injection),是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击.(被动攻击)
向首部主体内添加内容的攻击称为HTTP响应截断攻击(HTTP Response Splitting Attack)
一般手段:
设置任何 Cookie 信息
重定向至任意 URL
显示任意的主体(HTTP 响应截断攻击)
攻击实例
将 该字段最后的类别ID改为
此处输入的**%0D%0A,原本属于首部字段的查询值部分,然而经过解析后变成了换行符**,后面的Set-Cookie成为了新的首部字段.
类似这样,攻击者keke在响应中插入任意首部字段.
HTTP响应截断攻击
HTTP响应截断攻击与HTTP首部字段攻击顺序相同,但是要插入两个**%0D%0A,即两个换行符,**可做出首部与主体分隔所需的空行.显示伪造的主体,
邮件首部注入攻击
邮件首部注入攻击(Mail Header Injection)是指Web应用中的邮件发送功能,攻击者通过向邮件首部 To 或 Subject 内任意添加非法内容发起的攻击.
攻击实例:
还是一个邮件网页(咨询表单)
在邮箱地址一栏中填入
一旦咨询表单所在的Web应用接收该换行符,可能实现 对Bcc邮件地址的追加发送.
或是加两个换行符,实现对邮件文本内容的的篡改
用同样的方法,可能改写 To 和 Subject 等任意邮件首部,或添加附件等.
目录遍历攻击
目录遍历攻击(Directory Traversal) 攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击,也称 路径遍历攻击(Path Traversal).
原理:在有外部指定文件名的处理存在疏漏的情况下,用户可使用 ../的相对路径定位到绝对路径下
攻击案例:
原本的请求文件URI为
若设置为
如果read.php没有设限,那么原本不公开的为文件会被展现出来
远程文件包含漏洞
远程文件包含漏洞(remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,即可运行任意脚本的一种攻击
该漏洞主要存在于PHP中.对于PHP的include 或 require 来说,这是一种可通过设定,指定外部服务器端URL为文件名的功能,在PHP5.2.0后废用
攻击案例:
正常操作
该脚本的部分源码为
若输入如下URL
若该Web的 include 可以引入外部服务器的URL,那么实现在cmd.php准备
就可在服务器上OS命令了
因设置或设计上的缺陷引发的安全漏洞
强制浏览
强制浏览安全漏洞是指 从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件
对于原本不愿公开的文件,为了保证安全会隐藏其URL。但通过某些方法易使URL产生泄露
- 文件目录一览
未做防范措施,一般会在log文件夹下
容易被推测的文件名及目录名
备份文件
经认证才可访问的文件,直接通过URL访问能绕过一些认证
案例:
类似这样的博客,需要权限访问,但是通过对图片URL的分析,可能可以直接通过URL访问博客
不正确的错误消息处理
不正确的错误消息处理(Error Handing Vulnerability)的安全漏洞是指 web应用的错误信息内包含对攻击者有用的信息。
简单来讲:就是对 Web应用 和 数据库等应用 抛出的错误信息没有进行抑制设定,从而导致可能对攻击者有利的信息泄露
开放重定向
开放重定向(Open Redirect)是一种对指定的任意URL作重定向跳转的功能。
加入指定的重定向URL到某个具有恶意的Web网站,那么用户会被诱导至那个Web网站
案例:
将
改写为
可信度高的网站若开启重定向功能,则可能被选中作为钓鱼攻击的跳板
因会话管理疏忽引发的安全漏洞
会话劫持
会话劫持(Session Hijack)是攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。
具备认证功能的Web应用将 会话ID的会话管理机制 作为管理认证状态的主流方式。会话ID记录了Cookie等信息,服务器端会将会话ID与认证状态 一对一匹配管理
盗走会话ID的几种方式:
通过非正规的生成方法推测会话 ID
通过窃听或 XSS 攻击盗取会话 ID
通过会话固定攻击(Session Fixation)强行获取会话 ID
案例:
会话固定攻击
对于以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话 ID(被动攻击。)
案例:
攻击者用服务器给出的 会话ID 设计陷阱引诱用户认证,之后 攻击者可以伪装成用户登录网站
跨站请求伪造
跨站请求伪造(Cross-site Request Forgery CSRF)攻击, 是指 攻击者通过设计好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新(被动攻击)
案例:
当用户为已认证状态时,攻击者会在留言板上发布含恶意代码的评论,一旦用户访问该留言板时,恶意代码会被解析,以用户的身份进行操作
其他安全漏洞
密码破解
密码破解攻击(Password Cracking) 即算出密码,突破认证。
密码破解一般为两种手段
通过网络的密码试错
穷举法(略)
字典攻击
字典攻击是指利用事先收集好的候选密码(经过各种组合方法后存入字典)枚举字典中的密码,尝试通过认证的一种攻击手段
对已加密密码的破解
通过 穷举法&字典攻击进行类推
彩虹表
彩虹表(Rainbow Table)是由明文密码即与之对应的散列值构成的一张数据库表。可以用来缩短 穷举法&字典攻击 的时间
拿到密钥
加密算法的漏洞
点击劫持
点击劫持(Clickjacking)是利用透明的按钮或链接做成陷阱,覆盖在Web页面之上。诱使不知情的用户点击的攻击手段。又称为界面伪装。
DoS攻击
DoS攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。(攻击对象不仅限于Web网站)
主要为两种手段
集中利用访问请求造成资源过载,资源用尽的同时,实际上服务就呈停止状态
通过攻击安全漏洞使服务停止
多台计算机发起的Dos攻击称为*DDoS攻击( Distributed Denial of Service attack)*,DDos攻击常利用被感染病毒的计算机做跳板
后门程序
后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。
通常后门程序有三类
开发阶段作为 Debug 调用的后门程序
开发者为了自身利益植入的后门程序
攻击者通过某种方法设置的后门程序
Mission Over!!!!