HTTP基础的简单理解
在了解HTTP协议之前,我们先了解下TCP/IP的参考模型,TCP/IP参考模型分为四层:应用层、传输层、网络层、链路层(数据链路层)。
应用层:为不同的网络应用提供所需的服务。
传输层:为应用层实体提供端到端的通信/传输功能,确保数据包的按顺序传送及数据的完整性。
网络层:处理网络上流动的数据包,它所包含的协议涉及到数据包在整个网络上的逻辑传输。
链路层:监控数据交换,处理网络连接的硬件部分。
TCP/IP通信传输流如下图所示:
HTTP在各层的封装处理:
与HTTP协议密切相关的协议/服务:IP,TCP,DNS
IP协议负责数据包的传送,当然,这需要配合IP地址和MAC地址,IP间的通信依赖MAC地址,这就涉及到用以解析地址的ARP协议了。
TCP提供了可靠的字节流服务,对要发送的大块数据进行分割成小数据包以易于传输,并且该协议可确认数据包是否送达到目的方。
DNS服务负责解析域名
URI(统一资源标识符)和URL(统一资源定位符)
URI:一个用于标识某一互联网资源名称的字符串。组成:主机名(含端口号)+相对路径+标识符
URL:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。组成:协议+主机名(含端口号)+相对路径
区别:URI表示请求资源在互联网上存在的位置,URL在表示请求资源的位置同时还要说明如何访问到这个资源,URL是URI的一个子集。参考资源:URL和URI的区别
Cookies
HTTP协议用于客户端和服务端之间通过请求和响应的交换所达成的通信,并且它是一种无状态的协议,不会对请求和响应之间的通信状态进行保存(无法根据前一次请求对这次请求做出处理),但为了能够有保存状态的功能,引入了cookies技术。
持久连接
HTTP初始版本时,每进行一次HTTP请求就会断开一次TCP连接,这情况在早期传输文本很小的时候倒也不觉得如何,但是随着时代的进步,所需传输的内容种类越来越多和内容越来越大了,每次连接后都会断开请求就大幅度的增加了通信量的开销了。幸好,自HTTP/1.1和部分HTTP/1.0来,有了持久连接这么个神奇的东西,它规定了只要任何一方没有明确的提出断开连接,那么就保持TCP连接状态。而在维持的TCP连接期间,可以多次进行HTTP请求来传输需要的内容。
HTTP/1.1默认保持持久连接,在HTTP的头部信息中会有Connection: Keep-alive属性,我们也可以通过浏览器开发工具的NetWork面板查看这个属性的状态及HTTP请求信息:
如何关闭持久连接:在响应头设置Connection属性为close.
得益于持久连接,HTTP实现了管线化,能够做到同时并行发送多个请求,而无需一个接一个的等待响应。
HTTP请求的内容结构
HTTP协议交互的信息称为HTTP报文,通过下面的图来看看HTTP报文的结构:
除却空行(回车符、换行符),大致分为报文首部和报文主体。报文首部包含请求行(请求的方法、URI、HTTP版本)和状态行(响应状态码、原因短语、HTTP版本),首部字段(请求和响应的条件和属性),其他(未定义的首部)。
首部字段
首部字段规定了客户端如何处理请求和服务端如何处理响应,根据用途可分为四种:请求首部(请求报文使用的首部),响应首部(响应报文使用的首部),通用首部(请求和响应通用的首部),实体首部(报文实体部分使用的首部)。
HTTP/1.1首部字段列表
通用首部字段
1
2
3
4
5
6
7
8
9
10
|
首部字段名 说明 Cache-Control 控制缓存的行为 Connection 逐跳首部、连接的管理 Date 创建报文的日期时间 Pragma 报文指令 Trailer 报文末端的首部一览 Transfer-Encoding 指定报文主体的传输编码方式 Upgrade 升级为其他协议 Via 代理服务器的相关信息 Warning 错误通知 |
请求首部字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
首部字段名 说明 Accept 用户代理可处理的媒体类型 Accept-Charset 优先的字符集 Accept-Encoding 优先的内容编码 Accept-Language 优先的语言(自然语言) Authorization Web认证信息 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-Agent HTTP客户端程序的信息 |
响应首部字段
1
2
3
4
5
6
7
8
9
10
|
首部字段名 说明 Accept-Ranges 是否接受字节范围请求 Age 推算资源创建经过时间 ETag 资源的匹配信息 Location 令客户端重定向至指定的URI Proxy-Authenticate 代理服务器对客户端的认证信息 Reter-After 对再次发起请求的时机要求 Server HTTP服务器的安装信息 Vary 代理服务器缓存的管理信息 WWW-Authenticate 服务器对客户端的认证信息 |
实体首部字段
此外,还有一些如Cookie、Set-Cookie和Content-Disposition等在其他RFC中定义的首部字段也经常会被用到。
传输编码
HTTP传输数据的时候可以传输原数据,也可以在传输过程中编码以提升传输速率。通过传输时的编码处理,能有效的处理大量的访问请求。常用的内容编码有以下几种
· gzip(GUN zip)
· compress(UNIX系统的标准压缩)
· deflate(zlib)
· identity(不进行编码)
多部分对象集合
HTTP协议中采纳了多部分对象集合,允许发送的报文主体内可含有多类型实体。多用于上传文件或者图片时使用,可以设置Content-Type属性对其进行规定。如以下几种常见的形式:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据
Application:用于传输应用程序数据或者二进制数据
范围请求
实现这项功能需要指定下载的实体范围,如:一份1000字节大小的文件,想取300-3000字节范围内的资源,可以设置Range:bytes=300-3000;想取300-3000字节和5000字节到最后的资源,可以设置Range:bytes=300-3000,5000-
内容协商
内容协商机制是指客户端和服务端就响应资源内容进行交涉,然后提供给客户最为适合的资源,内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。涉及到以下首部字段:
· Accept
· Accept-Charset
· Accept-Encoding
· Accept-Language
· Content-Language
内容协商技术又分为三种类型
服务器驱动协商:服务端以请求的首部字段作为参考,在服务端处理并且返回对应资源。
客户端驱动协商:用户通过浏览器提供的可选列表进行手动选择,或者利用js脚本在web页面上自行选择。
透明协商:服务器驱动协商和代理驱动协商的结合体,当一个缓存被提供了构成响应的一系列可得的表现形式,并且维度的差异能完全被缓存理解,那么此缓存变得有能力代表源服务器为那个资源的后续请求去执行服务器驱动协商
内容协商可参考:内容协商
HTTP方法及状态码
HTTP方法
HTTP中也包含了一些方法,用于指定请求的资源按期望产生某种行为。对于这些方法,其中用的最多的是get和post,大家也一定很熟悉了~
HTTP/1.1和HTTP/1.0支持的方法
HTTP状态码
HTTP状态码表示客户端HTTP请求的返回结果,通过状态码,用户可以知道HTTP请求是否出现问题,问题出在哪,下面简单罗列一些HTTP状态码:
1
2
3
4
5
6
|
状态码类别 状态码性质 1XX 信息性状态码 2XX 成功状态码 3XX 重定向状态码 4XX 客户端错误状态码 5XX 服务器错误状态码 |
一些常见的状态码:
1
2
3
4
5
6
7
8
9
10
11
12
|
200 ok 正常处理请求 204 no content 服务端接收请求并成功处理,但返回的响应报文不含实体的主体部分 206 partial content 客户端进行范围请求,服务端成功执行这部分范围的get请求 301 moved permanently 永久性重定向 302 found 临时性重定向 303 see other 表示由于请求对于的资源存在另一个URI,应使用GET方法定向获取请求的资源 304 not modified 客户端发送附带条件的请求,服务端允许访问资源,但为满足条件 401 unauthorized 表示发送的请求需要有通过HTTP认证的认证信息 403 forbidden 请求资源的访问被服务端拒绝 404 not found 服务端无法找到请求的资源 500 internal server error 服务端执行请求时发生错误 503 service unavailable 服务端处于无法处理请求状态 |
HTTP代理及缓存
代理
代理指的是具有转发功能的应用程序,接收客户端的请求转发给服务端,也接收服务端的响应转发给客户端。代理不会改变请求的URI,会直接发送给持有资源的服务器。
在HTTP通信过程中可以级联多台代理服务器,并且转发时需要附加Via首部字段以标记经过的主机信息。
缓存
缓存是代理服务器或客户端本地磁盘内保存的资源副本,利用缓存来减少对源服务器的访问以便于节省通信流量和通信时间,也可以达到更好的交互体验。
请求的资源如果已经被缓存则直接由缓存服务器返回给客户端,或者客户端直接从本地磁盘读取。缓存可以设置有效时间,当判断缓存过期后,客户端/缓存服务器可像源服务器重新请求新资源。
HTTP安全升级--HTTPS
讲了一些HTTP的优点后,来看看HTTP的缺点
· 通信使用明文(未经加密),内容可能被窃听
· 不验证通信方的身份,请求/响应会遭伪装
· 无法证明报文的完整性,存在被篡改的可能
互联网的任何角落都存在通信内容被窃听的风险
按照TCP/IP协议的工作机制,通信内容在所有的通信线路上都有可能遭受窥视。即使是加密处理过的通信,也会被窥视到通信内容,只是经过了加密,就有可能让人无法破解出正确完整的报文信息含义,加密后的报文信息本身内容还是会被看到。
一般来说,窃听通信是通过收集在互联网上流动的数据包来做解析,这些可以通过抓包和嗅探工具实现,这也使得一些使用公共wifi账号被盗的事情时有发生。
针对明文传输这点,也可以对报文主体(传输内容)进行加密处理
针对身份验证这点,可通过在本地安装证书,存储身份认证信息等
针对确保信息完整性,MD5/SHA-1的散列值校验,数字签名等
HTTP => HTTPS
HTTP不带加密机制,但可以通过和SSL(安全 套接层...标注下阅读时的停顿)或TLS(安全层传输协议)的组合使用,用SSL建立安全通信线路后,就可以在这条线路上欢快的进行HTTP通信了。由于结合了SSL,HTTP升级成为HTTPS(或者 HTTP over SSL),然而这还不能说是个完整的HTTPS。
完整的HTTPS = HTTP + 加密 + 认证 + 完整性保护
一次完整的HTTPS请求
1.客户端发送Client Hello报文开始SSL通信,报文中包含客户端支持的SSL的指定版本、加密组件列表等
2.服务端可进行SSL通信时,会以Serve rHello报文作为应答
3.服务端发送Certificate报文,报文包含公开密钥证书
4.服务端发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束
5.SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应,其中包含通信加密中使用的随机密码串
6.客户端发送Change Cipher Spec报文,提示服务端此报文之后的通信采用符合上一步的随机密码串的密钥加密
7.客户端发送Finished报文,其中包含连接至今全部报文的整体校验值
8.服务端发送Change Cipher Spec报文
9.服务端发送Finished报文
10.Finished报文交换完毕后,SSL连接建立完成
11.应用层协议通信,HTTP
12.客户端断开连接,发送close notify
WebSocket 和 http/2.0
WebSocket
WebSocket实现了再Web客户端和服务端之间的全双工通信,一旦Web服务端与客户端之间建立WebSocket协议的通信连接,之后的所有通信都依赖这个专用协议进行。
WebSocket具有推送功能,服务端可直接向客户端推送数据,不必等待客户端的请求;由于WebSocket一直保持连接状态,并且首部信息小,使得通信量也相应的减少。
为了实现WebSocket通信。需要用到前面说到的HTTP首部字段Upgrade,达到告知服务端通信协议发生改变,当成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。
HTTP/2.0
核心优势/特性
多路复用:多个请求都是通过一个 TCP 连接并发完成(HTTP/1.1管线化在多个请求之间的响应会被阻塞,HTTP/2.0解决了这问题,并且支持优先级和流量控制)
头部压缩:报文头部压缩处理,数通信量更小
服务端推送:服务端能够更快的把资源推送给客户端
语义改进:采用二进制格式传输数据
Web的攻击技术
以服务器为目标的主动攻击,代表性的有SQL注入和OS命令注入,SQL注入是指攻击者通过直接访问Web应用,把攻击的SQL代码传入服务端以执行数据库来获取所需的数据信息或篡改数据库信息(调用SQL语句的方式所产生的漏洞);OS命令攻击指的是在服务端执行非法的操作系统命令达到攻击的目的。
以服务器为目标的被动攻击,其模式如下:
1.攻击者诱导用户触发已经设置好的陷阱,启动发送已嵌入攻击代码的HTTP请求
2.含有攻击代码的HTTP发送到服务端并允许
3.运行完攻击代码后,存在安全漏洞的Web应用便会成为攻击者的跳板,导致个人信息被窃取(网络安全课的知识全还给老师了...起初看到这些,一脸懵逼...)
以客户端为目标的主动攻击,代表性的跨站脚步攻击(XSS),通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript代码进行的一种攻击方式,该攻击可获取用户个人信息等
还有HTTP首部注入攻击、邮件首部注入攻击、目录遍历攻击、远程文件所包含的漏洞等
设置或设计导致的安全漏洞
强制浏览,从安置在Web服务端的公开目录下的文件中浏览那些原本非自愿公开的文件,导致个人信息/内部文件信息的泄露
抛出错误信息导致的漏洞,暴露出系统的出错点,给攻击者提供了攻击的突破点
开放重定向,对任意URL作重定向跳转的功能,攻击者可诱导用户到具有恶意的Web站点
会话管理疏忽导致的安全漏洞
会话劫持,攻击者通过一些手段拿到用户会话ID,并使用此会话ID伪装成用户达到攻击的目的
攻击者可能获得会话ID的一些方式:
· 通过非正规的生成方法推测出会话ID
· 通过窃听或XSS攻击盗取会话ID
· 通过会话固定攻击强行获取会话ID
会话固定攻击,大致模式为:攻击者访问站点拿到未认证的会话ID,设置陷阱强制用户使用这个会话ID前去认证,一旦用户触发陷阱并完成认证,攻击者就可使用用户的身份顺利登陆网站
跨站点请求伪造,攻击者通过设置的陷阱强制对已完成认证的用户进行非预期的信息某些状态的更新
其他安全漏洞
密码破解,获取密码,突破认证(通过网络密码试错或者对已加密的密码进行破解),密码破解如字典攻击、彩虹表、获取密钥、加密算法漏洞等
点击劫持,又称界面伪装,大多以透明层元素作为陷阱以达到攻击目的
Dos攻击,让服务端的服务呈停止状态(利用访问请求造成资源过载,资源用尽以停止服务;通过攻击安全漏洞停止服务)
后门程序,开发者debug的程序,开发者为自身利益植入的程序等