目录
- HTTP 请求的结构
- HTTP 请求的整体架构
- 请求方法(Method)
- 请求路径(URI)
- GET 参数(Parameters for GET)
- 协议说明(Protocol)
- 头部字段(Headers)
- 请求体(Body)
- HTTP 响应的结构
- 协议说明(Protocol)
- 状态码(StatusCode)与状态说明(StatusDescription)
HTTP协议主要分为请求和响应两部分。请求和响应都是采用标准的HTTP格式,分为“头(header)”和“体(Body)”两部分,使用单独的一行空行来隔开。请求头和响应头都是必需的(在HTTP/0.9,没有响应头,不做讨论),而请求体和响应体则可以缺省
HTTP 请求的结构
HTTP 请求的整体架构
请求方法(Method)
请求方法体现了本次请求的目的
方法名 | 说明 |
---|---|
GET | 最为常见的方法,单击链接打开网页通常使用的都是GET方法,表示一次普通的请求 |
POST | 提交数据时常用POST方法,主要用于登录、提交表单、上传文件等 |
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方法 |
HEAD | 与GET请求基本一致,但不返回响应体 |
PUT | 早期用于向服务器上传文件,后来被RESTFul架构所重用,用来更新资源 |
DELETE | 早期用于删除服务器上指定文件,后来被RESTFul架构所重用,用来删除资源 |
TRACE | 回显服务器收到的请求,主要用于调试和诊断 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
- 此外,被许多服务器认可的方法还有:ACL、CANCELUPLOAD(cancelupload),CHECKOUT、COPY、LOCK、MKCALENDAR、MKCOL、MOVE、UPDATE、SEARCH等
请求路径(URI)
(URI表示了请求的资源路径。)
(统一资源标识符(Uniform Resource Identifier,URI))
- 请求方法与URI之间是以若干个空格或TAB(制表符)来分隔的,通常是一个空格
- 传统架构下,URI对应了网站目录结构。在新型的web架构下,会配置Web路由,根据URI映射不同的处理接口。当服务器被配置为HTTP代理时,这里通常是一串形如“http://xxxx”或“http://xxxxx”的数据。但在一般情况下,这里都是一串以“/”开头的资源路径。若所请求的资源是该服务器主页时,往往写作“/”即网站根目录,这时Web Server会根据当前的配置返回默认的首页,通常是”/index.html“或”/index“等。
GET 参数(Parameters for GET)
GET参数通常是一些细化请求的描述
- 例如:文章id、页码、请求时间等。MVC架构主要以GET参数作为请求路径和接口对应。在URI之后如果还需要提交 GET 参数会以"?"作为分割符,在问号之后是一串参数序列。
- 特殊情况下,如果请求的是首页并且存在“?”,此时“/”可以缺省,但是这个特性仅限于Apache服务器,Nginx则不行。
- “?”后面的一串参数序列也有特定的格式约束,总体来说是以“&”作为不同参数的分割。每个参数由“key=value”的形式组成,key和value以第一个“=”划分。当参数出现数组时,以"key[name]=value"的形似进行提交。
协议说明(Protocol)
协议说明表示了当前请求使用的协议和版本。
- 以“HTTP/”开头,然后加上版本号,例如“HTTP/1.1”。URI(没有GET参数的情况)或GET参数与协议说明之间也是采用若干个空格或TAB(制表符)分割的,通常是一个空格。
- 到这里,第一行的内容已经结束了,此时一般需要一个“\r\n”作为换行符,之后的几行是HTTP请求的头部字段,各字段之间的换行符默认均为“\r\n”,在一些Web Server中也是支持单独的“\n”.
头部字段(Headers)
头部字段说明了本次请求的域名(HOST)、使用的浏览器(User-Agent)以及Cookie等。头部字段有很多,下面列举几个常见的
字段名 | 说明 |
---|---|
Host | 指定所访问的域名,对于一台服务器搭建了多个网站的情况,Web Server 依据Host不同来决定分别交给哪个网站应用来处理请求。一般所说的修改本机Host文件,在HTTP请求中也可以通过修改HTTP包中的Host字段来完成 |
Referer | 当由一个页面A 单击超链接跳转到另外一个页面B,或通过提交表单到另外一个页面时,浏览器会自动将页面A的URL放在请求B页面的Referer字段中,这个字段主要时是告诉服务器这个请求时哪里来的。 |
User-Aagent | 浏览器特征说明会告诉服务器当前用户所用的操作系统以及浏览器的类型和版本号,方便网站呈现在适合当前用户的前端展示效果 |
Cookie | 这个字段十分重要,它会用来存储一些用户的状态,服务器通过读取这个字段可以清楚地了解用户当前地身份信息以及其他状态信息。 |
请求体(Body)
GET请求通常没有请求体,而POST请求通常会有。
- 注意,这里使用了了两个“通常”,表示都不是绝对地。HTTP协议地任何字段都是可以人为修改的,这也是我在接触和学习web安全非常重要的心得体会,不少漏洞正是存在这样的修改之中。
- 请求体主要用于提交大量不便于在请求头中传递的信息,之所以不便于在请求头中传递,主要是受长度限制和字符编码等因素影响,另外,如密码之类的信息,也比较适合放在请求体中传递,能够起到一定的保护作用。请求体的应用常见于POST方式提交的请求中。
HTTP 响应的结构
协议说明(Protocol)
- 协议说明用于说明当前响应是基于HTTP协议的哪一个版本,通常以“HTTP/”开头,后面加协议版本号,如:“HTTP/1.1”
状态码(StatusCode)与状态说明(StatusDescription)
- 这个字段相当重要,它说明了当前请求执行的结果。对有些漏洞的检测就是以响应状态码来判断的,比如大家熟知的“200 OK”"404 Not Found"等,常见的状态码及说明如下表
- HTTP状态码与安全息息相关。在漏洞挖掘中,不同的状态码表达了不同的服务器内部情况,细心的人往往能通过服务器细微的变化来感知漏洞是否存在。