http请求详解

http是用于从万维网即web服务器传输超文本到本地浏览器的传送协议

http是一个基于TCP/IP通信协议来传递数据;

http默认端口号为80,但是可以修改为其他端口

##HTTP请求报文格式

分为三个部分,请求行、请求头和请求体

请求行(Request Line)分为三个部分:请求方法请求地址协议及版本,以CRLF(\r\n)结束。

URL 是统一资源定位符,它代表了 Web 资源的唯一标识,如同电脑上的盘符路径。最常见的 URL 格式如下所示:

protocol://[user[:password]@]hostname[:post]/[path]/file[?param=value]
协议   分隔符   用户信息        域名      端口   路径   资源文件   参数键   参数值

下面是一张具体案例分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rewItIXN-1569760355219)(https://firmianay.gitbooks.io/ctf-all-in-one/content/pic/1.4.2_http_url.png)]

HTTP 方法

在提到 HTTP 方法之前,我们需要先讨论一下 HTTP 版本问题。HTTP 协议现在共有三个大版本,版本差异会导致一些潜在的漏洞利用方式。

版本简述
HTTP 0.9该版本只允许 GET 方法,具有典型的无状态性,无协议头和状态码,支持纯文本
HTTP 1.0增加了 HEAD 和 POST 方法,支持长连接、缓存和身份认证
HTTP 1.1增加了 Keep-alive 机制和 PipeLining 流水线,新增了 OPTIONS、PUT、DELETE、TRACE、CONNECT 方法
HTTP 2.0增加了多路复用、头部压缩、随时复位等功能
序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。

2. Header

Header可用于传递一些附加信息,格式: 键: 值,注意冒号后面有一个空格!如:

Content-Length: 1024
Content-Type: text/plain

2.1 请求和响应常见通用Header

名称作用
Content-Type请求体/响应体的类型,如:text/plain、application/json
Accept说明接收的类型,可以多个值,用,(半角逗号)分开
Content-Length请求体/响应体的长度,单位字节
Content-Encoding请求体/响应体的编码格式,如gzip,deflate
Accept-Encoding告知对方我方接受的Content-Encoding
ETag给当前资源的标识,和Last-ModifiedIf-None-MatchIf-Modified-Since配合,用于缓存控制
Cache-Control取值为一般为no-cachemax-age=XX,XX为个整数,表示该资源缓存有效期(秒)

2.2 常见请求Header

名称作用
Authorization用于设置身份认证信息
User-Agent用户标识,如:OS和浏览器的类型和版本
If-Modified-Since值为上一次服务器返回的 Last-Modified 值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取
If-None-Match值为上一次服务器返回的 ETag 值,一般会和If-Modified-Since一起出现
Cookie已有的Cookie
Referer表示请求引用自哪个地址,比如你从页面A跳转到页面B时,值为页面A的地址
Host请求的主机和端口号

2.3 常见响应Header

名称作用
Date服务器的日期
Last-Modified该资源最后被修改时间
Transfer-Encoding取值为一般为chunked,出现在Content-Length不能确定的情况下,表示服务器不知道响应版体的数据大小,一般同时还会出现Content-Encoding响应头
Set-Cookie设置Cookie
Location重定向到另一个URL,如输入浏览器就输入baidu.com回车,会自动跳到 https://www.baidu.com ,就是通过这个响应头控制的
Server后台服务器

3、状态码

状态码表明资源的请求结果状态,由三位十进制数组成,第一位代表基本的类别:

  • 1xx,提供信息
  • 2xx,请求成功提交
  • 3xx,客户端重定向其他资源
  • 4xx,请求包含错误
  • 5xx,服务端执行遇到错误

常见的状态码及短语如下所示:

状态码短语描述
100Continue服务端已收到请求并要求客户端继续发送主体
200Ok已成功提交,且响应主体中包含请求结果
201CreatedPUT 请求方法的返回状态,请求成功提交
301Moved Permanently请求永久重定向
302Found暂时重定向
304Not Modified指示浏览器使用缓存中的资源副本
400Bad Request客户端提交请求无效
401Unauthorized服务端要求身份验证
403Forbidden禁止访问被请求资源
404Not Found所请求的资源不存在
405Method Not Allowed请求方法不支持
413Request Entity Too Large请求主体过长
414Request URI Too Long请求URL过长
500Internal Server Error服务器执行请求时遇到错误
503Service UnavailableWeb 服务器正常,但请求无法被响应

401 状态支持的 HTTP 身份认证:

  • Basic,以 Base64 编码的方式发送证书
  • NTLM,一种质询-响应机制
  • Digest,一种质询-响应机制,随同证书一起使用一个随机的 MD5 校验和

##其他

HTTPS

HTTPS 用来弥补 HTTP 明文传输的缺陷。通过使用安全套接字 SSL,在端与端之间传输加密后的消息,保护传输数据的隐密性和完整性,并且原始的 HTTP 协议依然按照之前同样的方式运作,不需要改变。

Cookie

Cookie 是大多数 Web 应用程序所依赖的关键组成部分,它用来弥补 HTTP 的无状态记录的缺陷。服务器使用 Set-Cookie 发布 cookie,浏览器获取 cookie 后每次请求会在 Cookie 字段中包含 cookie 值。

Cookie 是一组键值对,另外还包括以下信息:

  • expires,用于设定 cookie 的有效时间。
  • domain,用于指定 cookie 的有效域。
  • path,用于指定 cookie 的有效 URL 路径。
  • secure,指定仅在 HTTPS 中提交 cookie。
  • HttpOnly,指定无法通过客户端 JavaScript 直接访问 cookie。

4. 推荐调试工具

4.1 cURL

cURL 相当强大命令行工具,基本上你知道的上层协议它都支持,具体使用方法就自行发现了,下图为发起一个HTTP GET请求并打印请求和响应的详细内容。

img

4.2 bat

batastaxie(谢孟军) 用Golang开发的类似cURL的命令行API调试工具,可以方便的打印出HTTP请求和响应,还能高亮Header、格式化JSON等功能,非常好用,API调式神器。

img

4.3 nc

nc 是 netcat 的简写,被称为“网络工具中的瑞士军刀”,不过我个人是把它当成Socket用,经常使用它来打印各种请求,当然它的作用可不只是这样,你也可以用它发起各式各样的请求,以前调式POP3也是用的它,只不过请求报文得自己写,上面有个图“HTTP请求和响应”就是用nc完成的。

5. HTTP的组成图示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61PI5KwO-1569760355223)(E:\Typora\zw\Pictures\1200)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值