发送一次请求会经历什么?
首先,当你打开一个页面,原始状态下客户端与web服务器两者之间没有关系,那么首先客户端发送一个请求,建立了连接,之后web服务器沿着链接返回响应,客户端收到响应,HTML代码,解析出图片文字,响应过后,断开连接,一次完整的请求就此结束
HTTP深入流程
什么是HTTP协议
HTTP是超文本传输协议,是一种规定了浏览器与服务器之间相互通信的规则,主要规定了数据传输的格式
HTTP是基于请求与响应模式的,无状态的应用层的协议
发起HTTP请求
在浏览器地址栏中输入一个URL并按下回车键就发起了一个HTTP请求
URL的标准格式为:协议://服务器IP[:端口]/路径/[?查询]
HTTP是不保存状态的协议即无状态协议(不记得之前的发送内容)
HTTP请求与响应
HTTP请求包括三部分:请求行,请求头,请求正文
HTTP响应包括三部分:响应行,响应头,响应正文
HTTP请求方法
GET:用于获取请求页面的指定信息(若请求资源为动态脚本,则返回内容为web解析后的HTML代码)
HEAD:除了服务器不可在响应里返回消息主体外,其他与GET方法相同,所以此方法经常用于测试超文本链接的有效性,可访问性与最近的改变,编写扫描工具时也经常用这个方法,因为只测试资源是否存在不用返回消息主体,所以速度较快
POST:与GET方法大致相同,只是GET方法没有请求内容,而POST有请求内容,最多用于向服务器发送大量的数据
PUT:用于请求服务器把请求的实体存储在请求资源下,若请求资源已存在,则进行替换,若不存在,就会创建这个资源
DELETE:请求服务器删除指定资源,但因为危险,所以服务器一般就会删除此方法
TRACE:允许客户端了解数据被请求链另一端的接收情况,并利用哪些数据进行测试
CONNECT:用于能动态切换到隧道的代理
OPTIONS:用于请求获得由URI标识的资源在请求或响应的过程中可以使用的功能选项,通过这个方法,客户端可以在请求资源之前,决定对资源采取的措施,并了解相关的情况
HTTP状态码
HTTP状态码由3位数字构成
1xx:信息提示,表示请求已被成功接收100-101
2xx:成功,服务器成功的处理了请求200-206
3xx:重定向,重定向状态码用于告诉客户端,他们访问的资源已被移动,并告诉客户端新的资源地址位置,此时,浏览器会重新发起请求300-305
4xx:客户端错误状态码,比如说客户端发送了一个错误的请求,或者是请求了一个错误的URL400-415
5xx:客户端请求正确,但是服务器内部错误500-505
HTTP消息
又称为HTTP头,由四部分构成:请求头,响应头,普通头,实体头
-
请求头:
只出现与HTTP的请求头中,请求报头允许客户端向服务器端传送请求的附加信息和客户端自身信息
下面是常用的HTTP请求头:
Host: 用于指定被请求资源的Internet主机和端口号,eg:www.xxser.com:801
User-Agent: 请求报头域允许客户端将他的操作系统,浏览器和其他属性告诉服务器。就比如说,登录一些网站时,我们可以看到能显示我们的浏览器,系统信息,这些就是该头的作用
Referer: Referer包含一个URL,代表当前访问的URL的上一个URL,也就是说用户是从什么页面来到的本页面。eg:www.xxser.com/login.php代表用户是从login.php来到的本页面
Cookie: 是一段文本,常用来表示使用者身份
Range: 可以请求实体的部分内容,多线程下载可能会用到此头
(表示头500字节:bytes=0~499
表示第二个500字节:bytes=500~499
表示最后500字节:bytes=-500
表示500字节以后的范围:bytes=500-)
x-forward-for: 即XXF开头,代表请求端的IP,可以有多个,中间用逗号隔开
Accept: 请求报头域用于指定客户端收集哪些MIME类型的信息,eg:Accept:text/html表名用户希望接收HTML文本
Accept-Charset: 用于指定客户端接收的字符集 -
响应头:
是服务器根据请求向客户端发送的HTTP头
下面是常见的HTTP响应头:
Server:是服务器所使用的web服务器名称,eg:Server:Apache/1.2.3(Unix)攻击者通过查看此头,可以探测到web服务器名称。所以建议在服务器端修改此信息
Set-Cookie:向客户端设置Cookie,通过查看此头,可以清楚的看到服务器向客户端发送的Cookie信息
Last-Modified:服务器通过这个头告诉浏览器,资源最后的修改时间
Location:服务器通过这个头告诉浏览器去哪个页面,浏览器收到这个请求之后,通常会立刻访问此头所指的页面,此头通常配合302状态码使用
Refresh:服务器通过Refresh头告诉浏览器定时刷新浏览器 -
普通头
只有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息eg:Date:表示消息产生的日期和时间,Connection:允许发送指定链接的选项 -
实体头
Content-Type:用于接收方指示实体的介质类型
Content-Encoding:媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而,若要获得此报头域中所引用的媒体类型,必须采用相应的解码机制
Content-Length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示
Last-Modified:用于指示资源的最后修改日期和时间
HTTP协议与HTTPS协议的区别
HTTPS协议相较于HTTP协议更加的安全,HTTPS的安全基础是SSL,即在HTTP下加入SSL层,这种机制可以保护网络传送所有数据的完整性,降低非法入侵
- HTTP是明文传输,HTTPS是具有安全性的SSL加密传输协议
- HTTP采用80端口连接,HTTPS则使用443端口
- HTTPS协议需要到ca申请证书,或TOMCAT容器,而HTTP不需要
- HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份验证的网络协议
截取HTTP请求
在这里,我们用到了Burp Suite
可以看到此页面被中文乱码了