引言
在很多的工作中都是需要进行抓取到网络的相关数据进行分析,来进行查看访问到服务器返回的数据是否正确,来判断是否是自己想要的数据,可以通过这些数据做相关内容测试,主要抓取的就是收发的http报文。
http报文的基本结构
通过Burp或者Chome的开发者工具可以抓取数据包
请求报文
左边请求报文内容为
GET /weathernew/pc?query=%E9%99%95%E8%A5%BF%E8%A5%BF%E5%AE%89%E5%A4%A9%E6%B0%94&srcid=4982&city_name=%E8%A5%BF%E5%AE%89&province_name=%E9%99%95%E8%A5%BF HTTP/1.1
Host: weathernew.pae.baidu.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=2C80376AED4413057C59242EE6A62065; PSTM=1619581436; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[VXHUG3ZuJnT]=mk3SLVN4HKm; delPer=0; PSINO=6; H_PS_PSSID=31254; Hm_lvt_3535ee208b02ecdf4b2576fd444e8473=1625404549; BA_HECTOR=2lag0k2l0g8g20a1ba1ge3dht0q; Hm_lpvt_3535ee208b02ecdf4b2576fd444e8473=1625405258; BAIDUID=B1F754119FD6DE9A8C6429EC76978304:FG=1
Connection: close
大致分为 请求头 和 请求主体两个部分
请求头中的内容依次为 请求方法GET 、请求URL 和 HTTP协议版本 HTTP/1.1
GET /weathernew/pc?query=%E9%99%95%E8%A5%BF%E8%A5%BF%E5%AE%89%E5%A4%A9%E6%B0%94&srcid=4982&city_name=%E8%A5%BF%E5%AE%89&province_name=%E9%99%95%E8%A5%BF HTTP/1.1
报文主体主要包括
Host:接受请求的服务器地址,可以是IP:端口号,也可以是域名
User-Agent:浏览器身份标识,如Mozilla、Chrome、Safari
Accept:服务器能够发送哪些媒体类型
Accept-Encoding:服务器能够发送哪些编码方式
Accept-Language:服务器能够发送哪些语言
Cookie:客户端用它向服务器传送一个令牌,常用来验证请求者的身份
响应报文
响应报文的头部内容为
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 88707
Content-Type: text/html;charset=utf-8
Date: Sun, 04 Jul 2021 13:29:16 GMT
Expires: Sun, 04 Jul 2021 13:29:16 GMT
Server: Apache
Tracecode: 17563475360072666890070421
X-Powered-By: HHVM
Connection: close
HTTP响应报文主要由状态行、响应头部、响应正文3部分组成,响应头部主要包括:
响应头 | 说明 |
---|---|
Content-Type | 响应正文的类型(是图片还是二进制字符串) |
Content-Length | 响应正文长度 |
Content-Encoding | 响应正文使用的数据压缩格式 |
Server | 服务器应用程序软件的名称和版本 |
Date | 服务器的响应时间 |
天气API
以中国天气网为例,找到网站根据城市获取天气情况的API
可以利用火狐浏览器抓包分析并修改请求重发
中国天气网
根据响应确定数据包,查看请求头,找出API接口地址
http://d1.weather.com.cn/sk_2d/城市ID代码.html?_=1625571791121
通过编辑更改城市代码(改为西安 101110101)并重新发送请求
成功获取西安地区的天气状况
常见的HTTP请求
六种常见的http请求方法
方法 | 描述 |
---|---|
GET | 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等 |
POST | 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 |
HEAD | 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 |
PUT | 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 |
DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 |
GET:GET是最常见的http请求,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现据(如HTML文本,或者图片或者视频等)返回给客户端。
POST:向服务器提交数据。POST方法的用途非常广泛,几乎目前所有的提交操作都是靠这个完成。
HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。
OPTIONS:它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
get和post的区别
动作 | GET | POST |
---|---|---|
点击返回/刷新按钮 | 没有影响 | 数据会重新提交 |
缓存/添加书签 | 可以 | 不可以 |
历史记录 | 有 | 没有 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码 |
是否幂等 | 幂等 | 非幂等 |
长度限制 | http协议没有限制,但是实际浏览器或服务器有(最大2048) | 理论上没有,可能会收到服务器配置或内存限制 |
数据类型限制 | 只能ASCII,非ascii都要编码传输 | 没有限制,允许二进制数据 |
安全性 | 数据全部展示在url中,不安全 | 相比get,通过request body传递数据,比较安全 |
可见效 | 可见 | 不可见 |
“get”方法提交的数据会直接填充在请求报文的URL上,如“ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1 ” “?”问号划分域名和get提交的参数,A=B中的A是参数名,B是参数值,多个参数之间用&进行分割,如果参数值是中文,则会转换成诸如%ab%12加密16进制码。一般来说,浏览器处理的URL最大限度长度为1024B(不同浏览器不一样),所以GET方法提交参数长度有限制。
“post”方法提交的数据会附在正文上,一般请求正文的长度是没有限制的,但表单中所能处理的长度一般为100k(不同协议不同浏览器不一样),而且需要考虑下层报文的传输效率,不推荐过长。
所以GET方法可以用来传输一些可以公开的参数信息,解析也比较方便,如百度的搜索的关键词,而POST方法可以用来提交一个用户的敏感信息(如果不使用HTTPS加密,报文正文仍旧是明文,容易被人截获读取)