详解请求头信息
一.定义
HTTP请求头部(HTTP Request Headers):HTTP协议中的一部分,用于在客户端和服务器之间传递附加信息。这些头部字段提供了关于请求、客户端环境、或请求的上下文的信息。
请求头是键值对的形式,每个key对应填写相应的内容(内容可能包括多个取值,取多个值时,以“;”分隔)。
通过bp抓包可以得到或者更改请求头信息,比如以下就是通过bp抓访问百度包的请求头
GET / HTTP/1.1 |
二.常见请求头
字段 | 含义 | 举例 |
---|---|---|
Accept | 指定客户端可以接收的内容类型 | Accept:application/json, text/plain, / |
Accept-Charset | 浏览器能够接受的字符编码集 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器能够支持的web服务器返回内容压缩编码类型 | Accept-Encoding: gzip, deflate, br |
Accept-Language | 浏览器可接受的语言 | Accept-Language: zh-CN,zh;q=0.9 |
Accept-Ranges | 能够请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | 客户端认证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: max-age=0 |
Connection | 表示是否须要持久链接,HTTP 1.1默认进行持久链接 | Connection: keep-alive |
Cookie | HTTP请求发送时,会把保存在该请求域名下的全部cookie值一块儿发送给web服务器 | |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/json;charset=UTF-8 |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
Host | 指定请求的服务器的域名和端口号 | Host: www.baidu.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 若是请求的部分在指定时间以后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 若是内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 若是实体未改变,服务器发送客户端丢失的部分,不然发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间以后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息经过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 链接到代理的受权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: www.baidu.com |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(若是支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent(UA) | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通讯协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
X-Forwarded-For | 用来说明从哪里来的,一般用来内网伪装 | X-Forwarded-For: 127.0.0.1 |
三.详解
1.Host:请求主机名(见表格)
2.Referer:来源url(见表格)
3.Authorization:身份信息
向服务器提供身份验证信息。要求登录权限的接口,在请求时使用此字段。
用户登录后,服务器返回token,此后调用其他接口添加Authorization字段,字段value通常格式为“Bearer {toke}”或“Basic {authentication}”。例如
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
4.Content-Type内容格式
是一种 MIME 类型,指定在POST或PUT请求中发送的数据的类型,用于告知服务器请求体的数据类型(如表单数据、JSON数据等)。
Content-Type 字段的值通常遵循 type/subtype 的格式,由三部分组成:主类型type、子类型subtype、可选参数parameter。
格式:type/subtype[:parameter](主类型/子类型[;可选参数]) |
type : 主类型,任意的字符串,如text,如果是*号代表所有。
subtype : 子类型,任意的字符串,如html,如果是*号代表所有,用“/”与主类型隔开;是更具体的格式。
parameter:可选参数,如charset,boundary等。
常见类型
大类 | type/subtype |
---|---|
text | text/plain:纯文本,不包含任何标记或格式。 |
text/html:HTML 格式。当浏览器请求一个网页时,服务器通常返回此类型的响应。 | |
text/css:CSS 格式样式表 | |
text/javascript:JavaScript 格式 | |
image | image/jpeg:JPEG图片 |
image/png:PNG图片 | |
image/gif:GIF图片 | |
image/svg+xml:SVG 图片 | |
audio | audio/mpeg:mpeg音频 |
video | video/mp4:mp4视频 |
multipart | multipart/form-data:当表单需要上传文件时,通常会使用此类型。它允许你在HTTP请求中发送二进制数据。 |
application | application/x-www-form-urlencoded:表单数据最常见的(默认)编码类型,特别是当表单不包含文件上传时。它表示表单数据已编码为键值对,并使用URL编码进行编码。 |
application/json:JSON 数据格式(JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。) | |
application/pdf:PDF 文档 | |
application/zip:ZIP 归档数据 | |
application/x-gzip:GZIP 压缩数据 | |
application/javascript:JavaScript 脚本 | |
application/xml:XML格式的数据。(XML是一种用于编码文档的标记语言,被广泛用于网络数据的传输和存储。) | |
application/octet-stream:二进制流数据。当服务器不知道或不想指明数据的具体类型时,通常会使用此类型。 |
5.Content-Length内容长度
指定POST或PUT请求中发送的数据的长度。
Content-Length如果存在并且有效,必须和消息内容的传输长度完全一致,否则就会导致异常。以下为三种情况
Content-Length和实际长度关系 | 现象 |
---|---|
Content-Length > 实际长度 | 服务端/客户端读取到消息结尾后,会等待下一个字节,自然会无响应直到超时 |
Content-Length == 实际长度 | 服务器正常接收完整数据 |
Content-Length < 实际长度 | 截取指定长度数据 |
如果不确定Content-Length的值,使用:
Transfer-Encoding:chunked |
该字段表示分块传输数据,设置这个字段会自动产生两个效果:
① Content-Length 字段被忽略;
② 基于长连接持续推送动态内容。
6.Connection连接类型
客户端与服务连接类型。
3种取值:keep-alive(长链接接)、close(短链接)、upgrade(升级协议)。
HTTP/1.0协议默认值为close;
HTTP/1.1协议默认值为keep-alive。
举例:
Connection:keep-alive |
7.User-Agent客户端信息
发送请求的浏览器或其他客户端软件的信息。可以包括浏览器的名称和版本、操作系统等信息。
常见的User-Agent值
1、Chrome(谷歌)
【Win7】
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1
【Win10】
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
【Chrome 17.0 – MAC】
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11
2、Firefox(火狐)
【Win7】
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
【Firefox 4.0.1 – MAC】
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
3、Safari(苹果计算机操作系统Mac OS中的浏览器)
【safari 5.1 – MAC】
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
【safari 5.1 – Windows】
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
4、Opera(欧朋浏览器可以在Windows、Mac和Linux三个操作系统平台上运行)
【Opera 11.11 – MAC】
User-Agent:Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11
【Opera 11.11 – Windows】
User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11
5、IE
【IE 11】
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
【IE 9.0】
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;
【IE 8.0】
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
【IE 7.0】
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
【IE 6.0】
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
【WinXP+ie8】
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)
【WinXP+ie7】
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
【WinXP+ie6】
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
6、傲游
【傲游(Maxthon)】
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)
7、搜狗
【搜狗浏览器 1.x】
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)
8、360
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)
9、QQ浏览器
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)
8.Accept接收数据格式
指定客户端接受的数据类型,取值基本同Content-Type。accept可取多个值,以英文“,”分隔,每个值可设置权重(weight)参数q,用于在多种可能的类型都不支持时指定回退选项的优先级。
Accept常见的数据类型取值
类型 | 描述 |
---|---|
*/* |
客户端接受任何格式的应答 |
text/html | HTML格式 |
text/plain | 纯文本格式 |
text/xml | XML格式 |
image/gif | gif图片格式 |
image/jpeg | jpg图片格式 |
image/png | png图片格式 |
video/mpeg | 视频 |
vedio/quicktime | 视频 |
application/xhtml+xml | XHTML格式 |
application/xml | XML数据格式 |
application/atom+xml | Atom XML聚合格式 |
application/json | JSON数据格式 |
application/pdf | pdf格式 |
application/msword | Word文档格式 |
application/octet-stream | 二进制流数据(如常见的文件下载) |
application/x-www-form-urlencoded | < form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) |
9.cookies浏览器缓存
cookie是一门客户端技术,一般是由服务器生成返回给浏览器客户端来保存的,并且cookie是以键值对的形式保存在浏览器客户端的,每一个cookie都会有名称,值,过期时间
格式 cookies: key1=value1;key2=value2… |
这里还要补充一个知识点,就是cookie中的session伪造
补充:session伪造
原理
flask中的session是存储在客户端的cookie中,flask仅对数据进行签名,所以session的全部内容都可以在客户端读取,flask通过一个secret_key密钥对数据 进行签名来防止session被篡改。
前提
得到session信息 并且 知道flask的签名的SECRET_KEY
session结构
flask session通常是由三部分组成,中间通过.
来进行分割,第一部分就是我们json形式的数据通过base64加密后的结果,第二部分是时间戳,也算是签名算法,第三部分就是我们的密钥签名
时间戳:用来告诉服务端数据最后一次更新的时间,超过31天的会话,将会过期,变为无效会话;
签名:是利用
Hmac
算法,将session数据和时间戳加上secret_key
加密而成的,用来保证数据没有被修改。
解密脚本
#!/usr/bin/env python3 |
通过flask_unsign进行加解密
python安装flask-unsign库
pip install flask-unsign |
先对cookie进行解密
flask-unsign --decode --cookie '待解密内容' |
签名加密
flask-unsign --sign --cookie "待加密内容(json数据)" --secret '密钥' |