参考详解request headers(一篇讲完常见字段)

一.定义

HTTP请求头部(HTTP Request Headers):HTTP协议中的一部分,用于在客户端和服务器之间传递附加信息。这些头部字段提供了关于请求、客户端环境、或请求的上下文的信息。

请求头是键值对的形式,每个key对应填写相应的内容(内容可能包括多个取值,取多个值时,以“;”分隔)。
通过bp抓包可以得到或者更改请求头信息,比如以下就是通过bp抓访问百度包的请求头

GET / HTTP/1.1
Host: www.baidu.com
Cookie: BAIDUID=D915327BE37405BA6581E6C24AC9305D:FG=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22380654666%22%2C%22first_id%22%3A%221935df1042d1e5a-0a8a9fc02-4c657b58-1821369-1935df1042eeb5%22%2C%22props%7D%2C%22%24device_id%22%3A%221935df1042d1e5a-00faf5a8a9fc02-4c657b58-1821369-1935df1042eeb5%22%7D; BDUSS=1NNWkM5Vkt2b3U2Q2dVazBSY043dTBpVW82fnQ1bzJnOTJ-TEM2RHVSczdLbnRuRVFBQUFBJCQAAAAAAAAAAAEAAABE9JvK0~fH373cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADudU2c7nVNnN;
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Ch-Ua: "Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Priority: u=0, i
Connection: keep-alive

二.常见请求头

字段 含义 举例
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
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode


def decryption(payload):
payload, sig = payload.rsplit(b'.', 1)
payload, timestamp = payload.rsplit(b'.', 1)

decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True

try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of '
'an exception')

if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before '
'decoding the payload')

return session_json_serializer.loads(payload)


if __name__ == '__main__':
print(decryption("待解密的session值".encode()))#把需要加密的flasksession的值换一下就行

通过flask_unsign进行加解密

python安装flask-unsign库

pip install flask-unsign

先对cookie进行解密

flask-unsign --decode --cookie '待解密内容'

签名加密

flask-unsign --sign --cookie "待加密内容(json数据)" --secret '密钥'