无状态的Http协议
http协议的最新版本是1.1。是一种无状态协议。
什么是无状态协议?
无状态协议是指web浏览器与web服务器之间不需要建立持久链接。当客户端向服务器端发送请求(Request)时,服务器响应客户端的请求(Response),链接就被关闭了,在服务器端不保留链接的有关信息。也就是说http请求只能由客户端发起服务器端不能主动向客户端发送数据。
不知道大家有没看过《记忆碎片》,这部电影里面的男主角患了罕见的短期记忆丧失症,也就是同一个人,上次一起打过招呼,下次遇上了也不认识。但是他借助于纸跟笔,以及身上的纹身让他去记住一些东西。这好比在我们web开发中的cookie
及session
。就是因为http得了脸盲症cookie
和session
才会应运而生。
http请求与响应
http遵循请求(Request)/应答(Response)模型
HTTP请求
POST /login.php HTTP/1.1 //请求行
HOST: www.jiejieyh.cn //请求头
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
//空白行,代表请求头结束
Username=admin&password=12345 //请求正文
请求行
HTTP请求的第一行即为请求行,请求行有三部分组成
第一部分说明了该请求是POST请求
第二部分说明请求的是该域名根目录下的login.php
第三部分说明使用的HTTP协议版本
请求头
第二行至空白行为HTTP中的请求头
HOST代表请求的主机地址
User-Agent 代表浏览器标识
请求头由客户端自行设定
请求正文
HTTP请求的最后一行为请求正文,请求正文是可选的。最常出现在POST请求方法中。
HTTP响应
HTTP/1.1 200 OK
Date: Wed, 23 Nov 2016 10:18:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 83
Connection: keep-alive
Server: Apache
X-Powered-By: PHP/7.0.7
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Authorization, origin, X-Requested-With, Content-Type, XMLHttpRequest,request-id
Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
//空白行代表相应头结束
<!DOCTYPE html>
<html lang="zh-CN">
<head> //响应正文或者叫消息主题
<meta charset="utf-8">
...
响应行
HTTP响应的第一行为响应行,其中有HTTP版本,状态码、以及消息“OK”
响应头
第二行至末尾空白行为响应头,由服务器向客户端发送。
响应正文
响应头之后是响应正文,服务器向客户端发送的数据
HTTP请求方法
GET
GET方法用于获取请求页面的指定信息(以实体的格式)
GET /index.php?id=1 HTTP/1.1
HOST: www.jiejieyh.cn
HEAD
使用HEAD方法服务器不能在响应里返回消息主体,其它与GET相同。此方法常用来测试超文本的有效性、可访问性和最近的改变。
攻击者编写扫描工具时,常用此方法,因为只测试资源是否存在,而不用返回消息主体。速度一定是最快的
HEAD /index.php HTTP/1.1
HOST: www.jiejieyh.cn
POST
POST方法与GET方法相似,最大的区别在于GET方法没有请求内容,而POST是有请求内容的。
POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,但是有长度限制。
GET请求将发送的数据显式在浏览器端,而POST则不会。安全性相对对对对高一点...
POST /interface/login.php HTTP/1.1
Host: www.jiejieyh.cn
Connection: keep-alive
Content-Length: 63
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://www.jiejieyh.cn
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://www.jiejieyh.cn/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
act=kol&userName=admin&passWord=123456&vcode=9614&autoLogin=0
PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在则覆盖,不存在将会创建这个资源。数据为请求正文
PUT /input.txt
HOST:www.jiejieyh.cn
12346
这段HTTP PUT请求将会在主机根目录下创建input.txt,内容为123456。不用想,通常情况下通过请求写入文件,服务器都会禁止的。
DELETE
DELETE 方法用于请求源服务器删除指定的资源,服务器一搬会关闭此方法。
TRACE
TRACE方法用于激发一个远程的应用层的请求消息回路。也就是说回显服务器收到的请求。TRACE方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断,此方法非常少见。
CONNECT
HTTP 1.1协议规范保留了CONNECT方法,用于能动态切换到隧道的代理。
OPTIONS
OPTIONS方法是用于请求获得由URL标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施。或者了解服务器的性能。
OPTIONS / HTTP/1.1
HOST:www.jiejieyh.cn
HTTP/1.1 200 OK
Allow:OPTIONS,TRACE,GET,HEAD,POST
Server:Microsoft-IIs/7.5
Public:OPTIONS,TRACE,GET,HEAD,POST
X-Powerd-By:ASP.NET
Content-Length:0
Http状态码
客户端发出请求后,服务器接收处理完成后会 向客户端发送响应信息,其中Http响应中的第一行中,最重要的一点就是Http的状态码
HTTP/1.1 200 ok
此时的状态码为200,在Http协议中表示请求成功
Http的状态码由3位数字组成,第一位数字定义了响应的类别且有只有以下5种:
1xx:信息提示,表示请求已经被成功接收,继续处理。范围100-101
2xx:成功,服务器成功的处理了请求,范围200-206
3xx:重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告诉客户端新的资源地址位置。这时浏览器将重新对新资源发起请求。范围300-305
4xx:客户端错误码,有时候客户端会发送一些服务器无法处理的东西,比如格式错误的请求,请求一个不存在的url...其范围是400-415
5xx:客户端发送的请求有效,服务器自身出错了,5xx就是用来描述服务器内部错误的,范围500-505
常见的状态码
200:客户端请求成功
302:重定向
404:请求的资源不存在
401:请求未经授权
500:服务器内部错误
503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Http消息
Http消息称为Http头,由4部分组成 请求头、响应头、普通头、实体头。
请求头
请求头只出现在Http请求中,请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
常用的Http请求头
Host:主要用于指定被请求的Internet主机和端口号 HOST:www.jiejieyh.cn:801
User-Agent:请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器 User-Agent:My privacy
Referer:Referer包含一个URL,代表当前访问的URL的上一个URL,也就是说用户是从什么地方来到本页面。
Referer:www.jiejieyh.cn/register.phpCookie:Cookie是非常重要的请求头,它是一段文本,常用来表示请求者的身份等。
-
Range可以请求实体的部分内容,多线程下载一定会用到此请求头。例如:
表示头500个字节:bytes=0~499
表示第二个500字节:bytes=500~999
表示最后500字节:bytes=-500
表示500字节以后的范围:bytes=500-
x-forward-for:即XXF头,它代表请求端的IP,可以有多个,中间以逗号隔开
Accept:用于指定客户端接收那些MIME类型的信息,如Accept:text/html,表明客户端希望接收HTML文本。
Accept-Charset:用于指定客户端接收的字符集例如:Accept-Charset:utf-8,gb2312。如果在请求消息中没有设置这个域,默认是任何字符集都可以接收。
响应头
Server:服务器所使用的Web服务器名称,如Server:Apache/1.3.6(Unix),攻击者可以通过此头探测Web服务器名称。建议在服务器端进行修改此头的信息
Set-Cookie:向客户端设置Cookie,通过查看此头可以清楚地看到服务器向客户端发送的Cookie信息
Last-Modified:服务器通过这个头告诉浏览器,资源最后修改时间
Location:服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个响应之后,通常会立刻访问Location头所指向的页面。这个头通常配合302状态码使用。
Refresh:服务器通过Refresh头告诉浏览器定时刷新浏览器
实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。
Content-Type:用于向接收方指定实体的介质类型。
Content-Encoding:用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Last-Modified:用于指示资源的最后修改日期和时间。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。