摘要:本文介绍GET请求与POST请求的协议头
一、GET请求协议头
通过对https://www.discuz.net/member.php?mod=logging&action=login
进行抓包,得到以下协议头
GET https://www.discuz.net/member.php?mod=logging&action=login HTTP/1.1
Host: www.discuz.net
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: t7asq_4ad6_saltkey=ij9yIq2l; t7asq_4ad6_lastvisit=1576495060; _ga=GA1.2.1256802490.1576498661; _gid=GA1.2.1480736390.1576498661; t7asq_4ad6_lastact=1576498668%09member.php%09logging
现在我来一 一介绍这些协议头所要表达的含义
- GET https://www.discuz.net/member.php?mod=logging&action=login HTTP/1.1
这一段为请求行(request line) ,有三个段:方法字段、URL字段和HTTP版本字段。
方法字段:表示本次访问请求方法是GET
URL字段:https://www.discuz.net/member.php?mod=logging&action=login ,这个是本次访问的网址
HTTP版本字段:HTTP/1.1
- Host: www.discuz.net
简单的来讲就是域名(主机名)
- Connection: keep-alive
这个是保持连接或者是持久连接。
当出现Connection: close
,表示这是一个一次性连接。
- Upgrade-Insecure-Requests: 1
这东西对于我们抓包没啥用,只是申明浏览器支持从 http 请求自动升级为 https 请求,并且在以后发送请求的时候都使用 https
- User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
用户代理,用于证明自己是浏览器还是手机访问,这个在post上很重要。
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3
告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
- Sec-Fetch-Site: none 与 Sec-Fetch-Mode: navigate
这是Chrome 意欲在76版本 实现 Fetch Metadata 请求头提案 ,提案的请求头包括请求目标 Sec-Fetch-Dest
(类似 Initiator)、请求模式 Sec-Fetch-Mode
(跨域规则与浏览上下文)、是否跨域的 Sec-Fetch-Site
和是否用户触发的 Sec-Fetch-User
。
- Accept-Encoding: gzip, deflate, br
向服务器申明客户端(浏览器)可以接收的编码方法,通常为压缩方法,在post的时候尽量不要提交这个协议头。
- Accept-Language: zh-CN,zh;q=0.9
浏览器申明自己接收的语言
- Cookie
Cookie本文不说,留到后面单独讲
二、POST请求协议头
很多上面介绍过了,这边介绍上没没有出现的,
以下是抓取到的一个登陆包:
```POST https://www.discuz.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LF1II&inajax=1 HTTP/1.1```
Host: www.discuz.net
Connection: keep-alive
```Content-Length: 226```
```Cache-Control: max-age=0```
```Origin: https://www.discuz.net```
Upgrade-Insecure-Requests: 1
```Content-Type: application/x-www-form-urlencoded```
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: nested-navigate
```Referer: https://www.discuz.net/member.php?mod=logging&action=login```
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: t7asq_4ad6_saltkey=ij9yIq2l; t7asq_4ad6_lastvisit=1576495060; _ga=GA1.2.1256802490.1576498661; _gid=GA1.2.1480736390.1576498661; t7asq_4ad6_sendmail=1; t7asq_4ad6_seccode=3181024.8f03f04ecbe2722ed1; _gat_gtag_UA_150716312_1=1; t7asq_4ad6_lastact=1576566255%09misc.php%09seccode
```formhash=86da67b7&referer=https%3A%2F%2Fwww.discuz.net%2F.%2F&loginfield=username&username=%C3%C6%C9%A7%B5%C4%C7%E0%B4%BA&password=a123456&questionid=0&answer=&seccodehash=cS&seccodemodid=member%3A%3Alogging&seccodeverify=eq3g```
标红的是这次要介绍的,现在介绍第一个的含义
- POST https://www.discuz.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LF1II&inajax=1 HTTP/1.1
以post方式请求连接
- Content-Length: 226
用于描述HTTP消息实体的传输长度,也就是你提交的参数里有多少字节,在自己手动post提交时,别在附加协议头上带上这段,不然容易出错。
- Cache-Control: max-age=0
在http中,Cache-Control
是控制缓存开关的字段中的一个,常见的有两个值,一个是max-age=0
,另一个是no-cache
,前者max-age>0 时 直接从游览器缓存中 提取,max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改,有的话 返回200 ,无的话 返回304.;后者是强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验,严格要求使用最新数据。
- Referer: https://www.discuz.net/member.php?mod=logging&action=login
Origin: https://www.discuz.net
Referer:告知服务器请求的原始资源的URI,其用于所有类型的请求,并且包括:协议+域名+查询参数
Originr: 用来说明请求从哪里发起的,包括,且仅仅包括协议和域名。
PS:Referer在基本在get和post都会有 必须附加上,Originr一般只出现在post时才有,附加时带上不会出错,不带上可能会出错。
- Content-Type: application/x-www-form-urlencoded
这是提交的数据类型,有多种类型,这个不用去管它,抓包抓到啥,提交的时候就提交啥。这个也很重要,有些网站往往会检测这个,附加时也附加上。
这里我将post附加的协议头必须要有的给整理一下:
Host: www.discuz.net
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Origin: https://www.discuz.net
Referer: https://www.discuz.net/member.php?mod=logging&action=login
再次点一下,附加是,不要把Accept-Encoding: gzip, deflate, br
附加上
忘记说了,这个是post要提交的参数,这边先不讲,后面讲
formhash=86da67b7&referer=https%3A%2F%2Fwww.discuz.net%2F.%2F&loginfield=username&username=%C3%C6%C9%A7%B5%C4%C7%E0%B4%BA&password=a123456&questionid=0&answer=&seccodehash=cS&seccodemodid=member%3A%3Alogging&seccodeverify=eq3g