HTTP:Hypertext Transfer Protocol(超文本传输/转移协议)
一.网络基础
TCP/IP:
是互联网相关的各类协议族的总称,HTTP是属于其内部的一个子集。!协议族按照层次分为:
应用层:决定了向用户提供应用服务时通信活动,eg:HTTP,FTP,DNS
传输层:处于网络连接中两台计算机之间的数据传输,有TCP和UDP
网络层:处理网络上流动的数据包(网络传输的最小数据单位),规定了通过怎么的传输路线到达对方计算机并把数据包传送给对方。
数据链路层:处理链接网络的硬件部分。包括控制操作系统,驱动,网卡,光纤等物理可见部分
发送顺序:
与HTTP密切相关的协议:
TCP:提供可靠的字节流服务(为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理),采用三次握手策略:
1.发送端发送一个带SYN的数据包给对方
2.接收端回传一个带SYN/ACK标志的数据包以示传达确认消息
3.发送端在回传一个带ACK标识的数据包,代表握手结束
IP:要将各种数据包传送给对方,其中两个重要条件就是IP地址和MAC地址。过程:根据IP地址,用APR(一种用以解析地址的协议)反查出对应的MAC地址,利用MAC进行通信
IP地址:指明节点被分配到的地址,可以和MAC地址进行配对,可变
MAC地址:网卡所属的固定地址,基本不变
DNS:提供域名到IP地址之间的解析服务
URI和URL:
URI:统一资源标识符:标识某一互联网资源
URI格式:
服务器地址可以是DNS可解析的名称,或者192.168.1.1这类IPv4地址,或者
[0:0:0:0:0:0:0:1]这种用[]的IPv6地址名
URL:统一资源定位符(URI子集):标识资源的地点
二.简单的HTTP
报文:
请求报文:
请求方法、请求URI、协议版本 //起始行
可选的请求首部字段 //可分为请求首部字段、通用首部字段、实体首部字段,Cookie等为未定义首部
//空行分隔
内容实体
响应报文:
协议版本、状态码和原因短语 //起始行
可选的请求首部字段 //可分为响应首部字段、通用首部字段、实体首部字段
//空行分隔
资源实体的主体
报文主体和实体主体的差异:
报文主体:HTTP通信中的基本单位,由8位组字节流组成
实体主体:作为请求或响应的有效载荷数据被传输
报文主体用于传输实体主体,所以通常,报文主体等于实体主体。主要当传输中进行编码操作(为了提升传输速率),实体主体的内容发生变化,两者才会产生差异。
多部份对象集合:
HTTP协议中也采用了多部份对象集合,发送的一份报文主体可能含有多类型实体,通常是在图片或文件等上传时使用。使用多部份对象集合时,首部字段需加上Content-type
multiparty/form-data:web表单文件上传时使用
mmultiparty/byteranges:包含了多个范围的内容时使用
获取部分内容的范围请求:
使得能从下载中断处恢复下载,要实现。需要指定下载的非实体范围,用首部字段Range来指定资源的byte范围,eg:Range: byte=5001-1000,12000-
-3000 //一开始到3000 12000- //12000之后全部
HTTP方法:
GET:获取资源
POST:传输实体主题,主要目的不是为了获取响应的主体内容
PUT:传输文件,但由于HTTP/1.1的PUT自身不带验证机制,存在安全性问题,一般不用,但配合REST架构的可能可以,返回204,已存
HEAD:获得报文首部,不返回主体部分,用于确认URI的有效性及资源更新的日期时间等
DELETE:删除文件,与PUT相反,同无验证机制,返回204,已删
OPTIONS:查询请求指定资源支持的方法,起始行:OPTIONS * HTTP/1.1
TRACE:追踪路径,在Max-Forwards首部字段中填入数值,每经过一个服务器,该数值-1,当到0的时候,停止传输,最后收到请求的服务器返回200 OK的相应,可以可以查询发送出去的请求怎么被加工修改。但可能会引发XST(跨站追踪)攻击。起始行:TRACE / HTTP/1.1
CONNECT:要求用隧道协议连接代理:要求和代理服务器通信时建立隧道,主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。起始行:CONNECT 代理服务器名:端口号 HTTP/1.1
状态码:
1xx:信息行状态码
2xx:成功状态码
200:OK------正常处理了
204:No Content-----已处理,但响应报文不含实体的主体部分eg:发送请求,204响应则浏览器页面不更新
206:Partial Content------进行了范围请求,并成功执行,响应报文中含有指定范围的实体内容
3xx:重定向状态码
301:Moved Permanently------永久性重定向,请求的资源已被分配了新的URI,以后都使用新的URI
302:Found-----临时性重定向,请求的资源已被分配了新的URI,希望用户本次能用新的URI,但以后还可能会变
303:See Other------请求的资源存在另一个URI,与302有着相同功能,但303明确表示客户端应采用GET获取资源
301和 302标准是禁止将POST改为GET,但实际当返回301、302、303时,几乎所有浏览器都会把POST改为 GET,并删除报文内的主体,再次发送。
304:Not Modified------发送附带条件的请求时,允许访问,但未能满足条件的情况,返回不包含任何主体部分
307:Temporary Redirect------临时重定向,与302含义相同,但不会将POST变成GET
4xx:客户端错误状态码
400:Bad Request------请求报文中存在语法错位
401:Unauthorized------需认证或认证失败
403:Forbidden------被拒绝,可能因为访问权限等原因
404:Not Found------无法找到请求资源,也可以在服务器拒绝请求且不想说明理由时使用
5xx:服务器错误状态码
500:Internal Server Error------服务器在执行请求时发生了错误
503:Service Unavailable------服务器暂时处于超负载或正在停机维护,如果确定状况所需时间,最好写入 RetryAfterf返回给客户端
首部字段:
通用首部字段:
Cache-Control:控制缓存行为,指令的参数可选,“,”来分隔
Connection:
控制不再转发给代理的首部字段:写哪个首部字段,哪个就会被删除,请求再转发
管理持久连接:默认为Keep-Alive,还有close
Date:表明创建HTTP报文的日期和时间
Pragma:HTTP/1.1之前版本的历史遗留字段,仅用于客户端请求,值为no-cache,要求所有的中间服务器不返回 缓存文件
Trailer:事先说明再报文主体后记录了哪些首部字段
Transfer-Encoding:规定了传输报文主体时采用的编码方式
Upgrade:弄个与检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全
不同的通信协议。使用这个字段时,还需要Connection:Upgrade
Via:追踪客户端和服务器之间的传输路径(代理或网关会Via附加该服务器信息),还可避免请求回环的发生
Warning:告知用户一些与缓存相关的问题的警告。格式如下:
Warning:[警告码][警告的主机:端口号]"[警告内容]"([日期时间])
部分警告码如下,还可能追加:
请求首部字段:
Accept:通知服务器,用户代理能处理的媒体类型及媒体类型的相对优先级。使用q=来额外表示权重值,用分号分 隔,默认为1
Accept-Charset:通知服务器用户代理支持的字符集及相对优先顺序,优先同上
Accept-Encoding:告知服务器用户支持的内容编码及相对优先顺序,优先同上,也可以用*指定任意编码格式
Accept-Language:用户能够处理的自然语言集(中文或英文等)及优先级,优先同上
Authorization:认证
Expect:期望出现某种特定行为,当服务器无法理解客户端期望时,返回417Expection Failed
From:告知服务器使用用户代理的用户的电子邮件地址,目的是为了显示搜索引擎等用户代理的负责人的电子邮
件联系方式。使用代理时,尽可能使用From字段,但有些也会把邮件地址记录再User-Agent
Host:必写,告知服务器,请求的资源所处的互联网主机名和端口号
If-xxxx之类的字段,都可成为条件请求,服务器接收到后,只有判断指定条件为真才会执行请求
If-Match:匹配服务器匹配资源所用的实体标记(ETag)值,这时的服务器无法使用弱ETag值,一致才执行请求,
反之,返回412Precondition Failed。使用*则任意匹配
If-Modefied-Since:指定日期时间后,资源发生了更新,服务器会接受请求,反之返回304 Not Modefied
If-None-Match:与ETag不一致时
If-Range:若和ETag值或更新的日期时间一致,作为范围i请求处理,反之返回全体资源。
If-Unmodified-Since:指定日期之后未更新才能处理请求
Max-Forwards:通过TRACE或OPTIONS方法,发送包含该字段的请求时,该字段以十进制整数形式指定可经过的
服务器最大数,每经过一个,Max-Forwards -1,为0时不再转发,返回响应
Proxy-Authorization:类似与服务器之间的认证,这是与代理之间的认证。
Range:指定获取资源的范围,
Referer:告知服务器请求的原始资源的URI,一般会发,直接在地址栏写URI的时候也可以不发
TE:能够处理响应的传输编码方式及相对优先级,类似于Accept-Encoding,但用于传输编码
User-Agent:传达浏览器种类,也可能添加爬虫作者的电子邮件和代理服务器的名称
响应首部字段:
Accept-Ranges:bytes代表可处理范围请求,none反之
Age:告知客户端,源服务器在多久前创建了响应,单位为秒。若为缓存服务器,则是缓存后的
响应再次发起认证到认证完成的时间,代理创建响应时必须加上该字段
ETag:告知客户端实体表示,资源更新,ETag值更新。强ETag值是无论多小改变都会变化,若ETag
只有资源发生根本改变才会变,这时,会在值的开始处加W/
Location:将响应接收方引导至某个与请求URI位置不同的资源,会配合3xx进行重定向
Proxy-Authenticate:会把代理服务器要求的认证信息发送给客户端
Retry-After:告知客户端多久后再次发送请求
Server:服务器上安装的HTTP服务器应用程序的信息
Vary:当代理服务器接受到带有Vary字段指定获取资源的请求时,如果Accept-Language
字段值相同, 那么直接从缓存返回响应,反之则从源服务器获取资源后擦能作为响应返回
WWW-Authenticate:用于HTTP访问认证,告知客户端认证方案和带参数提示的质询
实体首部字段:
Allow:通知客户端能够支持Request-URI指定资源的所有HTTP方法。eg:只能用GET方法
Content-Encoding:服务器对实体的主体部分选用的内容编码方式。内容编码指的是在不丢失实体信息的前提下
所进行的压缩。
Content-Language:实体主体使用的自然语言(中文或英文等语言)
Content-Length:实体主体部分的大小。进行内容编码传输是,不能使用该字段
Content-Location:报文主体返回资源对应的URI。使用场景:返回的页面内容与实际请求对象不同
Content-MD5:客户端会对接收的报文主体执行相同的MD5算法,然后与该字段值比较
Content-Range:告知客户端返回的实体的哪个部分符合范围请求,eg:bytes 50001-10000/10000。表示
以字节为单位,当前发送部分及整个实体的大小
Content-Type:实体主体内对象的媒体类型。
Expires:将资源失效时期告知客户端。
Last-Modefied:资源最终修改的时间
其他首部字段
为Cookie服务的首部字段:
Set-Cookie:服务器准备开始管理客户端状态时,会事先告知各种信息。
Cookie:告知服务器,客户端想要获得HTTP状态管理支持
其他常用首部字段:
X-Frame-Options:属于响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题
主要是为了防止点击劫持攻击。有两个值DENY(拒绝)和SAMEORIGIN(仅同源域名下)
X-XSS-Protection:属于响应首部,针对跨站脚本攻击的一种策略,用于控制浏览器XSS防护开关,值为0/1
DNT:属于请求首部,表示拒绝被精准广告追踪的一种方式。值为0/1
P3P:属于响应首部,利用P3P(在线隐私偏好平台),可以在Web网站上的个人隐私变成仅供程序理解的
形式,以达到保护用户隐私的目的。步骤为创建P3P-->创建P3P隐私对照文件,保存命名在
/w3c/p3p.xml-->在P3P隐私种新建Compact policies,输出到HTTP响应种
状态管理:
HTTP是无状态协议,所以引入Cookie技术。Cookie通过在请求和响应报文中写入Cookie信息来控制客户端状态。过程如下:
1.请求无Cookie信息的时候,服务端生成Cookie,放进相应报文的Set-Cookie首部字段信息中
2.客户端保存Cookie,下次再往该服务器发送请求的时候,会自动在请求报文中加入Cookie值后发出去
3.服务端发现又Cookie,对比服务器上的记录,最后得到之前的状态信息
其他:
与HTTP协作的Web服务器
1.一台Web服务器可搭建多个独立域名的Web网站:利用虚拟主机,因为请求的时候,域名通过DNS映射到IP地址,所以请求发送到服务器,是以IP地址形式访问。为了收到请求的时候分清是哪个网站,请求必须在Host首部内完整指定主机名或域名的URI。
2.一台服务器可以作为通信路径上的中转服务器提升效率:
代理:a.中间人,一种有转发功能的应用程序。
b.可以利用缓存减少网络宽带的流量,组织内部针对特定网站的放问控制,以获取访问日志为主要目的等等。
c.每次通过代理转发时,需要附加Via首部字段以标记经过的主机信息。
d.代理主要根据是否使用缓存和是否会修改报文分类:缓存代理、透明代理
网关:工作机制和代理相似,但提供非HTTP协议服务。
利用网关可以提高通信的安全性。因为可以在客户端与网关之间的通信线路上加密以保证。
比如:连数据库,支付网关
隧道:相隔甚远的客户端和服务器之间的中转,以保持双方通信连接,不会做任何处理。
确保Web安全的HTTPS
1.HTTP的缺点:
a.通信使用明文,内容可能会被窃听:
TCP/IP的工作机制决定通信内容在所有的通信线路上都有可能遭遇窥视,即使加密,也能看到加密后的
目前可以通过
<1>通信加密:SSL(安全套接层)或TLS(安全层传输协议)的组合使用来加密HTTP的通信内容,与SSL组合使用
的HTTP为HTTPS
<2>内容加密:客户端对HTTP报文进行加密处理再发送,但内容仍有被篡改的风险
b.不验证通信方身份,可能遭遇伪装
虽然HTTP无法确定通信方,但SSL可以,它还提供了一种被称为证书的手段。证书由第三方机构颁布,用于证明
服务器和客户端是实际存在的。
c.无法验证报文的完整性,可能已遭篡改
请求或响应的传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击
2.HTTP+加密+认证+完整性保护=HTTPS
HTTPS不是应用层的一种新协议,至少HTTP通信接口部分用SSL/TLS,即先和SSL通信,再由SSL和TCP通信
涉及到私钥公钥等证书
使用HTTPS因为必须SSL通信以及加密等,会大量消耗CPU和内存等资源,一般回避HTTP慢2-100倍。所以一般只有
关键信息才加密处理,以及证书需要购买
认证
1.BASIC认证:是从HTTP/1.0就定义的认证方式,是Web服务器与通信客户端之间的认证方式。不加密,且一般浏览器无法实现认证注销操作。步骤:
a.当请求的资源需要BASIC认证是,服务器会随401返回带WWW-Authenticate字段的响应
b.客户端收到,将ID和密码(两者:连接)组成字符串,Base64编码之后写入Authorization发送请求
当用户代理为浏览器时,输入ID和密码即可,浏览器会自动完成转换工作
2.DIGEST认证:基于BASIC,a步骤的时候会发送一个质询码(nonce,随机数)。b步骤的时候Authorization必须包含username,realm,nonce,uri和response的字段信息。虽然可以防止密码被窃听,但无法方式用户伪装。
3.SSL认证:双认证:证书+密码或其他
4.基于表单认证
追加协议
SPDY:介于HTTP和SSL中间,是HTTP协议获得以下功能:
1.多路复用流:单以的TCP连接,可以无限制处理多个HTTP请求
2.赋予请求优先级
3.压缩HTTP首部
4.推送功能:支持服务器主动向客户端推送数据
5.服务器提示功能:主动提示客户端请求所需的资源
WebSocket:建立在HTTP基础上,连接发起方仍是客户端。但一旦连接,可以任意发报文
1.推送功能
2.减少通信量:一直保持连接状态,且WebSocket首部信息很小
Web攻击技术
1.针对Web应用的攻击:
主动攻击:通过直接访问Web应用,把攻击代码传入,代表有SQL注入攻击和OS命令注入攻击
被动攻击:诱使用户触发已设置好的陷阱,陷阱会启动发送嵌入攻击代码的HTTP请求,代表有跨站脚本攻击和跨站点
请求伪造
2.因输出值转义不完全引发的安全漏洞
3.设置或涉及上的缺陷引发的安全漏洞
4.因会话管理疏忽引发的安全漏洞