深入HTTP请求流程
啥叫HTTP协议
HTTP协议说人话就是超文本传输协议,是一中详细规定了浏览器和万维网网服务器之间相互通信的协议,听说是万维网交换信息的基础.
HTTP是一种无状态协议,意思是说Web浏览器与Web服务器之间不需要建立持久的连接,当客户端发送完HTTP请求(request),然后服务端返回HTTP响应(response)以后,连接就会被无情地断开~ 也就是说,言下之意就是,HTTP协议只允许客户端联系服务端.
HTTP请求
HTTP请求三个部分,分别为
*请求行 (请求方法)
*请求头 (消息报头)
*请求正文
HTTP请求例子:
post /login.php HTTP/1.1 //请求行
HOST: www.keysking.com //请求头(开始)
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0
//空白行 代表请求头结束,请求正文开始
Username=keysking&password=pass //请求正文
请求行
请求行用一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request-URI HTTP-Version
其中
Method表示请求方法;
Request-URI是一个统一资源标识符(也就是URL);
HTTP-Version表示请求的HTTP协议版本;
例如:
GET /form.html HTTP/1.1 (CRLF)
其中,请求方法有如下几种:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
请求头
在HTTP请求中,从第二行到空白行(见上面例子),都是请求头的国土.
Host
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
Referer
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。
(说人话就是,告诉服务器你是从哪个页面点进来的~~~)
User-Agent
User-Agent头域的内容包含发出请求的用户信息.
这玩意可暴露你好多信息呐,啥操作系统,浏览器啥的,统统发给服务器~
Cookie
别小看这个小饼干(cookie的原意)哦,它可是一个非常重要的请求头,常用来表示请求者的身份,我们平时让网站记住自己的登录状态就多亏了它哦~~
Range
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。貌似与文件的下载有关…不懂~~~QAQ
x-forward-for
又叫XFF头,它代表客户端,也就是HTTP的请求端的IP,可以有多个,中间用逗号隔开~ 标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。
听说可以通过伪造这玩意刷票~~(笑
Accept
用来告诉服务端客户端想获得哪些MIME类型的信息,比如
Accept: text/html
就表示客户端希望接受HTML文本.Accept-Charset
用于告诉服务器客户端想接受的字符集.
请求正文
HTTP请求的最后是请求正文,请求正文可有可没有,一般用于POST请求方法.
HTTP响应
服务器接到来自客户端的HTTP请求后,就会对请求进行分析处理,然后向客户端发送HTTP响应.HTTP响应也包含三个部分,分别是响应行,响应头(消息报头)和响应正文(消息主题).
HTTP/1.1 200 OK //响应行
Date: Sat, 31 Dec 2005 23:59:59 GMT //响应头开始
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
//空白行,代表响应行结束
<html> //响应正文
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
响应行
HTTP响应的第一行是响应行,其中包括HTTP版本,状态码(比如上面例子中的200),以及消息(“OK”).
响应行中的状态码用来告知客户端响应的状态,不同的状态码代表的状态不同.
状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下。
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK。
响应头
响应头与请求头的作用差不多,也是标识一些属性,常见的相应头如下:
Sever
服务器所用的Web服务器名称,比如Sever:Apache/1.3.6(Unix),渗透测试者可以利用这个探测Web服务器名称.
Set-Cookie
向服务端设置Cookie
Last-Modified
资料修改的最后时间.
Location
告诉浏览器去访问哪个页面,浏览器接收到这个请求后,通常会立刻访问Location头所指向的页面,通常配合302状态码使用.
Refresh
告诉浏览器定时刷新页面.
消息报头
是服务器向客户端发送的HTML数据
本笔记为keysking的学习笔记,部分内容来源于《Web安全深度剖析》以及网络资料
出于共享精神,欢迎转载,但请注明出处,谢谢 :)