详解http
TCP/IP 基础
在学习http之前,我们需要先了解一下TCP/IP 网络基础
我们通常使用的网络(包括互联网)都是在TCP/IP协议族的基础上运行的,而http则属于它内部的一个子集
TCP/IP 分层
TCP/IP 协议族按层次分,可以分为 应用层、传输层、网络层和数据链路层
- 应用层:用于存放各类通用的应用服务,如 HTTP、FTP、DNS 与用户最接近的协议, 都属于应用层
- 传输层: 提供处于网络连接中两台计算机之间的数据传输, 如 TCP 、UDP
- 网络层:用于处理网络上流动的数据包,数据包是网络传输的最小数据单位,该层规定了该通过怎样的路径进行通信,如 IP协议
- 链路层: 用于处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、网卡光纤等物理硬件
TCP/IP 通信传输
由上可得知,一次网络通信会大致通过上述四层,顺序是 应用层=>传输层=>网络层=>链路层,每往下走一层,都会加上该层所属的首部信息,到达底层的链路层后,链路层将信息发送至另一端,另一端拿到数据后,通过四层逐步往上走,每经过一层,就去掉该层所属层的首部信息,最后得到请求。
IP协议
IP协议位于网络层,几乎所有使用网络的系统都会用到IP协议,但是注意别IP协议和IP地址搞混。
IP协议的作用是把各种数据发送给对方,而要确保数据准确的发送到指定的目标,则需要满足各类条件,IP地址和MAC地址是两个重要的条件
IP地址指明了节点被分配的地址,MAC则是网卡所属的固定地址,即物理地址。IP地址可以和MAC地址进行配对,IP地址可能会变,MAC地址通常是不会改变的。
TCP协议
TCP协议的作用是确保数据能够准确可靠的传给对方,TCP协议会将拿到的HTTP数据分割成报文段,按照需要将这些片段依次发给对方。
讲到TCP那就不得不讲到它的 三次握手四次挥手
三次握手与四次挥手
三次握手的本质就是确认通讯双方收发数据的能力,保证数据准确无误的送达目标处。能防止服务端开启一些无用的连接增加服务器开销,以及已经失效的连接请求突然又传到了服务端,从而产生错误
使用三次握手建立连接
第一次握手:客户端向服务端发送 SYN数据包 请求建立连接,随后客户端进入 SYN_SENT状态
第二次握手:服务端收到SYN包,确认客户端的SYN包,同时自己也发送一个SYN包,即向客户端发送SYN+ACK包,随后服务端进入SYN_RECV 状态
第三次握手:客户端收到服务端的SYN+ACK包,向服务端发送确认包ACK,随后客户端和服务端就成功建立连接,三次握手结束
简单的来说,
客户端告诉服务端,我想请求连接
服务端确认客户端后,通知客户端,可以连接
客户端得到通知后,再告诉服务端,我要开始连接了
使用四次挥手结束连接
四次挥手用于结束连接,当某一端想要结束连接时,则发送一个 FIN数据包,来进行四次挥手
第一次挥手: 客户端向服务端发送一个FIN包,随后进入了FIN_WAIT_1状态
第二次挥手:服务端收到了FIN包后,向客户端发送ACK确认包,需要等待服务端进行处理,随后客户端就进入了 FIN_WAIT_2状态
第三次挥手:服务端处理完成,准备关闭连接,则向客户端发送FIN包,服务端进入 LAST_ACK状态
第四次挥手: 客户端收到FIN包,向服务端发送ACK包,随后进入TIME_WAIT状态,客户端断开连接。服务端收到ACK包后,服务端断开连接。
简单的来说:
客户端告诉服务端,我想要断开连接
服务端收到后,告诉客户端,请稍等
服务端准备完成后,告诉客户端,可以关闭了
客户端得到通知后,告诉服务端,关闭吧,随后进入等待模式,服务端得到客户端的通知则关闭,客户端等待一段时间后,若没有回复则客户端关闭
HTTP请求
客户端
发起一次http请求,其中会包含 请求方式 请求地址 附带参数 请求头部 等信息
请求方式(method)
http请求有多种方式,浏览器地址栏中访问地址,默认是使用get请求,除此之外,还有多种请求方式
方法 | 说明 |
---|---|
get | 获取资源 |
post | 传输实体主体 |
put | 传输文件 |
head | 获取报文首部 |
delete | 删除文件 |
options | 询问支持的方法 |
trace | 追踪路径 |
connect | 要求使用隧道代理 |
link/unlink | 连接/断开连接 |
请求地址(url)
请求地址 即目标主机的ip地址
ip地址 域名 DNS服务器 Hosts文件
ip地址即目标主机被分配到的地址,受网络环境影响,如无线网中,ip地址可能会经常发生变化
域名即把ip地址转换为一串字符串,相比于一串长长的数字用户更容易记住一串特定的字符串 ,如 www.baidu.com 就是一个域名,在cmd中 输入 ping www.baidu.com
即可得到它的ip地址,在浏览器中输入ip地址与直接输入域名,效果都是一样的
DNS服务器,在浏览器中输入了 www.baidu.com 后,浏览器就通过DNS服务器将域名解析成ip地址,然后再使用 http请求这个地址
Hosts文件可以理解为本地的DNS服务器,在进行DNS请求之前,windows会先去hosts寻找是否有这个域名的解析映射且不需要网络,如果有则直接使用hosts中的ip,如果没有,则请求DNS服务器
附带参数(data)
这里的参数即http请求中携带的参数,如get请求,其参数会跟在url地址后,post使用form表单传参等等
请求头部(Headers)
请求头用于标识请求方,说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。请求头种类众多,这里只列举几种最常见的请求头
协议头 | 作用 | 示例 |
---|---|---|
Accept | 可接受的响应内容类型 | */* (接受所有类型) |
Accept-Encoding | 可接受的响应内容的编码方式。 | gzip,deflate (GNU zip编码和zlib编码) |
Accept-Language | 可接受的响应内容语言列表。 | zh-CN,zh;q=0.9,en;q=0.8 (可接受中文和英文以逗号间隔,q代表权重,值越大越优先) |
Content-type | 请求体的MIME类型 (用于POST和PUT请求中) | multipart/form-data 表单文件上传时使用 |
Host | 表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),<则端口号可以省略。 | 192.168.xx.xxx:xxxx |
Origin | 发起一个针对跨域资源共享的请求 | http://localhost:8080 |
User-Agent | 浏览器的身份标识字符串 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36 例如我这里使用的是谷歌浏览器 |
除此之外还可以自己定义一些请求头,用做特殊标识
服务端
HTTP响应码
HTTP响应码用于表示HTTP请求的返回结果、标记服务器端的处理是否正常、通知出错等工作
类别:
1xx:接收的请求正在处理
2:xx:请求正常处理完成
3:xx:需要进行附加操作以完成请求
4xx:服务器无法处理请求
5xx:服务器处理请求出错
状态码 | 说明 |
---|---|
200 OK | 请求在服务端被正常处理了 |
204 No Content | 请求已成功处理,但是响应中不包含主体部分 |
206 Partial Content | 客户端请求指定范围的资源,且服务器成功执行了 |
301 Moved Permanently | 永久性重定向,表示请求的资源被分配到了新的url |
302 Found | 临时性重定向,表示请求的资源被分配到了新的url,希望能够使用新的url访问 |
303 See Other | 表示由于请求对应的资源存在另一个url,应使用get方法重定向获取资源 |
304 Not Modified | 表示客户端发送附带参数时,服务端允许访问资源,但请求未满足条件 |
400 Bad Request | 表示请求报文中出现语法错误 |
401 Unauthorized | 发送的请求需要通过HTTP认证,若之前已进行过一次认证,则表示认证失败 |
403 Forbidden | 请求资源的访问被服务器拒绝了 |
404 Not Found | 服务器上无法找到请求的资源 |
500 Internal Server Error | 服务器内部错误 |
503 Service Unavailable | 服务器处于超负载或正在进行停机维护,无法处理请求 |
与HTTP 协作的Web服务器
代理
代理是什么:
代理时一种具有转发功能的应用程序,它位于服务端和客户端之间,扮演一个“代理人”的角色
代理服务器的基本行为就是接收客户端发送的请求后转发给服务端,服务端返回的响应通过代理服务器后再传给客户端。在htt中,可以级联多个代理服务器,请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器,转发时则需要附带Via首部字段以标记经过的主机信息
*为什么使用代理:
使用代理的理由有:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志等等
缓存代理
代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上,当代理再次接收相同资源的请求时,就可以不从服务端那里获取资源,而是将之前缓存的资源返回
即使缓存服务器上由缓存,也不能保证每次都会返回相同资源的请求,这关系到时效性的问题
透明代理
转发请求或响应时,不对报文做任何加工的代理类型叫透明代理,反之,对报文内容进行加工的代理被称为非透明代理
网关
网关的工作机制类似于代理。而网关能使通信线路上的服务器提供非HTTP服务。
利用网关能提高通信的安全性,因为可以在客户端和网关服务器之间的通信路线上加密以保证连接的安全。
隧道
隧道可按要求建立起一条于其他服务器的通信线路,届时由SSL等加密手段进行通信 ,其目的时保证客户端于服务端的安全通信。
隧道本身不会去解析HTTP请求,HTTP请求会原样中继给服务端
HTTPS
HTTP的缺点
尽管http作为世界上最流行的网络通信协议,但它还是有许多不足
- 通讯使用明文,内容可能被窃听:
http本身不具备加密的功能,所以也无法对通讯整体进行加密,http的报文是使用明文发送的,这种方式可能会被抓包工具所捕获
不验证通讯方的身份,可能会遭遇伪装
在http中,不存在确认通信方的处理步骤,也就是说不论是谁发过来的请求都会返回响应,这会导致
- 无法确定发送至目标的web服务器是否是已伪装的web服务器
- 无法确定返回到的客户端是否是已伪装的客户端
- 无法确定正在通信的对方是否具备访问权限,因为某些服务器上保存这重要信息,只想发给特定用户通信的权限
- 无法判定请求来自何方,出自谁手
- 即使是无意义的请求也会接收,无法阻止海量请求下的DoS攻击
无法证明报文的完整性:
http无法证明通信报文的完整性,在请求或响应送出之后知道对方接收前的这段时间里,即使请求或响应遭到篡改也无法知晓
HTTPS
HTTP+加密+认证+完整性保护=HTTPS
加密
通过SSL(Secure Socket Layer 安全套接层)或 TLC(Transport Layer Security安全传输层协议),可以加密HTTP的通信内容。
通过这两个协议,可以在客户端于服务端搭建一条安全的通信线路,在此线路上使用HTTP协议进行通讯
认证
SSL使用了一种被称为证书的手段,用户访问服务端之前都会先检查服务端的证书;;;,用于确定通信方。证书由第三方机构颁发,用以证明服务器和客户端时实际存在的,且伪造证书从技术角度上来说是非常困难的一件事
完整性保护
通常使用MD5和SHA-1等散列值校验以及用来确认文件的数字签名方法来验证完整性。
提供文件下载服务的Web网站会提供相应的以PGP(Pretty Good Paivacy完美协议)创建的数字签名及MD5算法生成的散列值。PGP用来证明创建文字的数字签名。MD5是由单项函数生成的散列值。
无论哪一种方式,都需要用户本人亲自检查验证下载的文件是否就是服务器上的文件,浏览器无法自动帮用户检查,所以需要搭配加密,认证等方式
HTTPS 简单来说就是 披着SSL协议的HTTP
Web 攻击技术
主动攻击与被动攻击
主动攻击
攻击者通过直接访问Web应用,把攻击代码传入的攻击方式,其中具有代表性的是 SQL注入和 OS命令注入
被动攻击
利用圈套执行攻击代码的攻击模式,被动攻击中,攻击者不直接对Web应用访问发起攻击
跨站脚本攻击
攻击者诱使用户触发已设置好的陷阱,当用户中招后,陷阱程序会使用用户的浏览器发送具有攻击性的代码至服务器,将用户当作跳板,以达到攻击的目的
SQL注入攻击
通过运行非法的SQL而产生的攻击
例如在web表单中,输入 1 == 1
或--
等数据库特殊字符,以达到攻击服务端数据库的目的
OS 命令注入攻击
通过Web应用执行非法的操作系统命令达到攻击的目的,只要在能调用 Shell 函数的地方都有被攻击的风险
HTTP头部注入攻击
攻击者通过在响应头部字段内插入换行,添加任意头部或主体的一种攻击,属于被动攻击
目录遍历攻击
对本无意公开的文件目录,通过非法阶段其目录路径后,达成访问目的的一种攻击。因此服务器上的任意文件或目录都有可能被访问到
远程文件包含漏洞
当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的url充当依赖文件,让脚本读取之后,九颗运行任意脚本的一种攻击
会话劫持
攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID位置成用户,达到攻击的目的
密码破解
穷举法
又称暴力破解,是指对所有可行的候选密码对目标的密码系统进行试错,以突破验证的一种攻击
例如,某个Web应用的验证密码是由 4位数字 组成,即 0000-9999 中必存在正确密码,尝试所有的密码,可通过通过认证
字典攻击
利用事先收集好的候选密码,如用户的生日,用户的身份证号等等,进行尝试,成功的成败取决于字典的内容
点击劫持
利用透明的按钮或链接做成陷阱,覆盖至Web页面上,诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段
DoS 攻击
发送大量的合法请求,其中参杂着非法请求,让服务器难以分辨何为正常请求。以让运行中的服务呈现停止状态,有时也叫服务停止攻击和拒绝服务攻击