HTTP协议详解
HTTP是一种无状态的协议。无状态是指WEB浏览器与WEB服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后WEB服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息,也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
HTTP遵循请求(Request)/应答(response)模型,WEB浏览器向WEB服务器发送请求时,WEB服务器处理请求并返回适当的应答。
1、HTTP请求与相应
(1)HTTP请求
HTTP请求包括三部分:请求行(请求方法)、请求头(消息报头)和请求正文。
HTTP请求的第一行即为请求行,请求行由三部分组成,第一部分说明该请求时POST请求;第二部分是一个斜杠(/login.php),说明请求的是该域名根目录下的login.php,最后一部分说明使用的是HTTP1.1版本(另一个可选项是1.0)。
第二行至空白行为HTTP的请求头(也成为消息报头)。其中,HOST代表请求的主机地址,User-Agent代表浏览器的标识,请求头由客户端自行设定。
HTTP请求的最后一行为请求正文,请求正文是可选的,最常出现在POST请求方法中。
(2)请求响应
HTTP响应也由三部分组成:响应行、响应头(消息报头)和响应正文(消息主题)。
HTTP响应的第一行为响应行,其中包括HTTP版本(HTTP/1.1),状态码(200)以及消息“OK”。
第二行至末尾的空白行为响应头,由服务器向客户端发送。
最后一行为响应正文,是服务器向客户端发送的HTML数据
2、HTTP请求方法
HTTP请求方法非常多,GET,POST,HEAD,PUT等,其中GET、POST最常见。
(1)GET
GET方法用于获取页面的指定信息(以实体的格式)。若请求资源为动态脚本(非HTML),则返回文本是WEB容器解析后的HTML源代码,而不是源文件。
(2)HEAD
HEAD方法除了服务器不能再响应中返回消息主体外 ,其他均与GET方法相同。此方法常被用于测试超文本链接的有效性、可访问性和最近的改变。
(3)POST
POST方法也与GET方法相似,但区别在于GET方法没有请求内容,而POST有请求内容。POST请求多用于向服务器发送大量的数据,GET发送数据时大小(长度)有限制,且GET请求会将发送的数据显示在浏览器端,而POST不会,所以安全性相对较高。
(4)PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,若请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。若请求指定的资源不存在,将会创建这个资源。
(5)DELETE
DELETE方法用于请求源服务器删除请求的指定资源。服务器一般都会关闭此方法,因为客户端可以进行删除文件操作属于危险方法之一。
(6)TRACE
TRACE方法被用于激发一个远程的应用层的请求消息回路,即会显示服务器收到的请求。此方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断,但此方法非常少见。
(7)CONNECT
HTTP 1.1协议规范保留了CONNECT方法,此方法是为了用于能动态切换到隧道的代理。
(8)OPTIONS
OPTIONS方法用于请求获得由URL标识的资源在请求/响应的通信过程中可以使用的功能选项,通过此方法,客户单可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
3、HTTP状态码
HTTP协议中的状态码由三位数字组成,第一位数字定义了相应的类别,且仅有以下五种:
1xx:信息提示,表示请求已经被成功接收,急需处理。范围:100-101。
2xx:请求被成功提交,范围:200-206.
3xx:客户端被重定向到其他资源,范围:300-305.
4xx:客户端错误状态码,格式错误或不存在资源, 范围:400-415。
5xx:描述服务器内部错误,范围:500-505。
常见的状态码描述如下:
200:客户端请求成功,是最常见的状态。
302:重定向。
404:请求资源不存在,是最常见的状态。
401:请求未经授权。
403:服务器收到请求,但是拒绝提供服务。
500:服务器内部错误,是最常见的状态。
503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
4、HTTP消息
HTTP消息又称为HTTP头(HTTP Header),由四部分组成,分别为请求头、响应头、普通头和实体头。
(1)请求头
请求头只出现在HTTP请求中,请求报头允许客户端向服务器端传递请求的附加信息和客户端自身的信息。常用的HTTP请求头如下:
1> HOST
HOST请求报头域主要用于指定被请求资源的Internet主机和端口号。
2> User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用。
3> Referer
Referer包含一个URL,代表当前访问URL的上一个URL,即用户从什么地方来到此页面。
4>Cookie
Cookie是非常重要的请求头,为一段文本,常用来表示请求者身份等。
5>Range
Range可以请求实体的部分内容,多线程下载一定会用到此请求头。
6>x-forward-for
x-forward-for即XXF头,代表请求端的IP ,可以有多个,中间以逗号隔开。
7>Accept
Accept请求报头域用于指定客户端接收那些MME类型的信息。
8>Accept-Charset
Accept-Charset请求报头域用于指定客户端接收的字符集;若在请求消息中没有设置这个域,默认是任何字符集都可以接收。
(2)响应头
响应头是服务器根据请求向客户端发送的HTTP头,常见的HTTP响应头如下:
1>Server
服务器所使用的WEB服务器名称,攻击者通过查看此头,可以探测WEB服务器名称,所以建议在服务器端进行修改此头的信息。
2>Set-Cookie
向客户端设置Cookie,通过查看此头,可以看到服务器向客户端发送的Cookie信息。
3>Last-Modified
服务器通过这个头告诉浏览器,资源的最后修改时间。
4>Location
服务器通过这个头告诉浏览器去访问那个页面,浏览器接收到这个请求之后,通常会立刻访问Location头所指向的页面。此头通常配合302状态码使用。
5>Refresh
服务器通过Refresh头告诉;浏览器定时刷新浏览器。
(3)普通头
在普通报头中,有少数的报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。如:DATE,表示消息产生的日期和时间.Connection,允许发送指定连接的选项。
(4)实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括了实体信息类型、长度、压缩方法、最后一次修改时间等。常见的实体头如下:
1>Content-Type
Content-Type实体头用于向接收方指示实体的介质类型。
2>Content-Encoding
Content-Encoding头被用作媒体类型的修饰符,其值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Encoding报头域中所引用的媒体类型,必须采用相应的解码机制。
3>Content-Length
Content-Length实体报头用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
4>Last-Modified
Last-Modified实体报头用于指示资源的最后修改日期和时间。
5、拦截HTTP请求的分析点
1、所有输入点
访问资源名称
GET与POST参数
Referer与User Agent
HTTP方法
Cookie
2、更多输入点
Ajax
Web Service
Flash客户端
Java Applet