在详细讲解之前,我们需要了解几个名词
1.HTTP(HyperText Transfer Protocol)超文本传输协议
2.HTTPS(Hypertext Transfer Protocol Secure)超文本传输安全协议
3.URL(Uniform Resource Locator)统一资源定位符
4.C/S架构(client/server)客户端服务器架构
5.B/S架构(Browser/Server)浏览器服务器架构
http与https的区别在于http使用的是明文传输,端口为80,而https 采用了ssl加密,通过密文进行信息传输,端口443相比http较为安全,并且https的证书需要到ca进行申请,而http则不需要
接下来进入正文,题目是深入理解HTTP请求,那么我们如何发起一次http请求呢?其实当我们任意浏览一个网站的时候已经发起了http请求。http是一种无状态的协议,所谓的无状态是指服务器与服务器之间不会建立长久的链接,比如客户端向服务器发起了一次请求,服务器做出了响应,接下来这个链接便会被断开,即请求只能由客户端发送,服务器是不能主动向客户端发送请求的。
HTTP请求与响应
http的请求有三部分组成,请求行,请求头,请求正文,如下图所示
请求行中可以得知使用的请求方法为get方法,请求的是域名根目录下的article页面,使用的版本是http1.1;
从host一直到cookie之间的内容均为请求头,可以得知目的主机为imooc,user agent为浏览器表示,在ctf比赛中也常会遇到与浏览器标识有关的考点。其余的便为请求正文。
接下来来看响应
第一行是响应行,显示了http版本为1.1 状态是200
第二行到响应正文之间是响应头,可以看到使用的是nginx,请求的时间等等信息是由服务器发回到客户端的
其余的为响应正文,课可以看到HTML代码
状态码
在这里笔者仅列举常见到的状态码供大家学习
200:请求成功
302:重定向
404:请求资源不存在
500:服务器内部错误
502:无效网关
请求方法
http有很多种请求方法,笔者在这里仅对常见的进行介绍
1.get
第一张图我们展示的便是一个get的方法,我们来看下url,可以发现参数直接出现在url中,例如
我们可以通过修改参数来进行访问,比如将后后边的数字改为82或者类似?id=10086
之类的均为get方法,get方法存在很多安全牛弊端,比如攻击者可以通过参数进行注入或者越权等操作,甚至有些开发人员安全意识不高会出现将密码明文放到url中的?id=admin&psw=admin
2.post
相对于get,post较为安全因为我们无法再url中看到详细的信息,其与get最大的区别在于get是没有请求内容而post是有请求内容的,并且get对数据的大小有限制。
3.head
由于head方法是用来进行测试资源是否存在的,因此快捷高效,攻击者在进行扫描工具编写时常常会使用此方法。
4.put
put方法用于请求服务器将请求中的实体存储在资源之下,如果数据是存在的则会替换
另外还有delete,options等等请求方法,读者们有兴趣的话可以去维基百科详阅
HTTP消息
host:显示请求主机号与端口号
user agent:浏览器标识
在这里推荐一款好用的标识更改插件,firefox下的user agent switcher
cookie:小饼干通常用来表示请求者的身份