当前位置: 首页 > news >正文

HTTP请求方法:GET与POST的深度解析

http 首行的方法

描述了这次请求,想干啥

GET : 从服务器拿一个东西过来(读操作)

POST :往服务器放一个东西过去(写操作)

在实际开发中,完全可以用 POST 从服务器拿数据,也可以用 GET 往服务器放数据,完全可以不按说明来

POST 经常使用的场景

1.登录

2.上传

我们可以在登录后抓包到这个信息

GET 通常没有body,POST 通常由 body

GET 会把需要给服务器补充信息放到 querystring 中(url中)

POST 会把这些信息放到 body 中

一些不太准确的观点

1.POST 比 GET 更安全

论据:登录的时候,如果使用 GET,用户名密码就会显示在 url 上,此时就会被别人直接看到,所以就不安全

即使是 POST,数据没有显示在 URL,也是可以通过抓包获取到的

真正保证安全性关键在于加密

2.GET 传输的数据量小(存在上限),POST 传输的数据量更大

实际上 HTTP 标准文档上说了,对于 GET URL 的长度不做限制

3.GET 只能携带文本数据,POST 则可以携带二进制数据

URL 通过 query string 来携带数据

query string 是只能包含文本的,但是可以对二进制数据进行 urlencode,自然成了文本了

到了服务器自然进行 urldecode,就能把数据还原成二进制

POSt 请求 body 中也经常不是携带二进制,有很多时候是对二进制进行 urlencode / base64 等方式进行转码

HOST

表示服务器主机的地址和端口

URL 已经有 HOST 了

这里的 HOST 和  URL 中的 ip 地址 端口 绝大部分情况下都是一样的

和 body 密切相关,如果这个数据包,没有 body,也就不会有这两个字段

Content-Type: text/html

正常来说,响应都得有 Content-Type,只要有 body

实际上如果响应确实没有 Content-Type,也没有 body,这个时候,有些浏览器也能自己猜一猜

浏览器容错能力很强,即使返回的数据有问题,也尽可能正确显示出来

Content-Type: text/html; charset=utf-8

后面写的服务器程序返回网页,发现乱码,就可以检查一下是否这里的编码方式没有设置或者设置的有问题

Cookie

Cookie 本质上是一个,浏览器这边本地持久化存储数据的机制

浏览器作为一个程序可以调用 api 来读写本地磁盘文件

浏览器上运行的网页,能否通过浏览器提供的 api 来读写本地磁盘文件呢?

浏览器禁止禁止了这种方法(浏览器没有给 网页提供这样的 api)

一个网页不能直接读写 我们自己的硬盘文件

浏览器给网页提供这样的 API,能够有限度的存储数据(按照键值对的格式),而不能随意的访问文件系统

就诊卡本身就是客户端手里拿着的持久化存储数据的机制,就是 cookie

关于 cookie 几个重要结论

1.Cookie 从哪里来?服务器返回给浏览器的,通常都是首次访问 / 登录成功之后
2.Cookie 到哪里去?Cookie 会存储在浏览器本地主机的硬盘上,后续每次访问都会带上 Cookie
不同客户端,保存的 Cookie 是不同的,即使是同一个主机,使用不同的浏览器,Cookie 大概率不同
3.Cookie 中存什么?键值对格式的数据,这里的内容都是程序员自定义的,和 query string 一样
不同网站的 Cookie 都是不一样的
4.Cookie 在浏览器这边如何组织?
在硬盘本地保存,是按照不同的域名为维度分别存储
5.Cookie 的用途是什么?

用来在客户端保存数据

最为主要的是保存用户的身份标识,服务器就可以通过标识来区分用户了

一些其他的业务数据一般不会存储在 cookie中

cookie 随时可以删除掉,把业务数据存储在服务器,通过 cookie 中的身份标识找到对应的数据

浏览器的另一个保存机制,一般账号密码不会在 cookie 中保存,cookie 是要传输给服务器的

一般浏览器保存的密码都是明文密码,明文密码放到 cookie 是不合适

虽然 https 能加密,https 侧重于是“不能被篡改”,而不是“不能被解密”

状态码

用于响应中的,表示响应的结果如何

1.200   OK

2.404 NOT Found   访问的资源没找到(url 中的路径)

3.403 Forbidden

请求的资源没有权限访问

4.405

你的服务器只支持 GET 请求,但是你只发了个 POST

5. 500 Internal Server Error

服务器内部错误了

6.504 Gateway Timeout

访问服务器超时了

可能是服务器挂了,也可能是网挂了

7.302 Move temporarily   重定向(临时重定向)

明明访问的是网站 A,A就会让浏览器帮你跳转到 B

状态码,还有一个 特殊了,418

418 在 HTTP 协议的标准文档是存在的(但是没有实际意义)

如何构造出 HTTP 请求

1.通过代码构造

任何一种编程语言,只要能够操作网络,都可以构造 HTTP 请求

对于 Java 来说,需要使用 ServerSocket / Socket (Tcp 的 socket api 来编程)

本质上就是基于 Socket 写一个 TCP 客户端,然后往 socket 中按照 HTTP 协议的格式写入字符串即可

OkHttpClient(比较知名的 Java 的 HTTP 客户端库)

2.通过第三方工具构造

构造 HTTP 请求的第三方工具

postman

可以填写一些属性,通过send就可以发送请求到目标服务器了

还可以找到相应语言的代码

网页中构造 HTTP 请求

需要通过 HTML / JS 来构造 HTTP 请求了

比较经典的方式

1.form 表单
2.ajax

解决安全问题,最核心的要点,就是“加密”

引入加密是保证数据安全的有效手段

这样破解的成本就很高,加密的成本很低,破解的成本很高

HTTPS 工作过程

只要针对 HTTPS 的数据进行解密了,就能得到 HTTP 格式的数据

上述的运营商劫持,无论是修改 referer 还是修改返回的 链接(body),本质上都是 明文传输惹的祸

需要引入加密,对上述传输的数据进行保护

主要就是要针对 header 和 body 进行加密

1.引入对称加密

通过对称加密的方式,针对传输的数据进行加密操作

2.引入非对称加密

使用非对称加密,主要目的就是为了对称密钥进行加密,确保对称密钥的安全性

不能使用非对称加密,针对后续传输的各种, header body 等进行加密,而是只能使用非对称加密去加密对称密钥

非对称加密的加密解密成本(消耗的 CPU 资源)要远远高于对称加密

如果大规模使用,就难以承担了

SSL 内部完成工作,使用 HTTPS 的时候,底层也是 TCP,先进行 TCP 三次握手,TCP 连接打通之后,就要进行 SSL 的握手了(交换密钥的过程)

后面才是真正传输业务数据(完成的 HTTPS 的请求/ 响应)

上述操作下,仍然存在重要的安全漏洞,黑客仍然是有办法获取到对称密钥 key的

服务器可以创建出一对公钥 和 私钥,黑客,也可以按照同样的方式,创建出一对 公钥 和 私钥冒充自己是服务器

针对上述问题,如何解决?

最关键的一点,客户端拿到公钥的时候,要能有办法验证,这个公钥是否是真的,而不是黑客伪造的

要求服务器这边要提供一个“证书”

证书是一个结构化的数据(里面包含很多属性,最终以字符串的形式提供)

证书中会包含一系列的信息

比如,服务器的主域名,公钥,证书有效期

证书是搭建服务器的人,要从第三方的公正机构进行申请的

证书验证的过程

证书:

服务器的域名:

证书的有效时间:

服务器的公钥:

公正机构的信息:

。。。。。

证书的签名:

此处所谓的“签名”,本质上是一个经过加密的校验和

把证书中其他的字段通过一系列的算法(CRC,MD5等),得到一个较短的字符串 => 校验和

如果两份数据内容一样,此时校验和,就一定是相同的

如果校验和不同,两份数据的内容则一定不同

客户端拿到证书之后,主要做两件事:
1.按照同样的校验和算法,把证书的其他字段都重新算一遍,得到 校验和1
2.使用系统中内置的公正机构公钥,对证书中的签名进行解密,得到校验和2

此时,就可以对比,看这俩校验和是否一致

如果一致,说明证书是没有被修改过的,就是原版证书

如果不一致,说明证书被别人篡改过了,此时客户端就能识别出来了

黑客无法修改证书的内容

1.如果黑客直接修改公钥,不修改签名,此时,客户端验证的校验和是一定不一样的,就是别出来了
2.如果黑客修改公钥,也尝试重新生成签名
由于黑客不知道公正机构的私钥,所以黑客无法重新生成加密的签名,如果黑客拿自己的私钥加密呢?客户端这边拿着公正机构的公钥也会解密失败
上述操作就把黑客篡改证书的行为堵死了
3.黑客能不能自己也去公正机构申请个证书?然后把自己的证书替换掉服务器的证书呢?
还是不行
域名是唯一的,黑客申请的证书的域名,和服务器的域名肯定不同
客户端拿到证书之后,一看域名都不一样,直接就知道证书是假冒的了,都不用验证校验和
http://www.lryc.cn/news/624077.html

相关文章:

  • 【技术博客】480p 老番 → 8K 壁纸:APISR × SUPIR × CCSR「多重高清放大」完全指南
  • PCA 实现多向量压缩:首个主成分的深层意义
  • 平行双目视觉-动手学计算机视觉18
  • Go语言并发编程 ------ 锁机制详解
  • C++析构函数和线程退出1
  • C++继承(2)
  • Eclipse Tomcat Configuration
  • Docker-14.项目部署-DockerCompose
  • Docker入门:容器化技术的第一堂课
  • 飞算JavaAI赋能高吞吐服务器模拟:从0到百万级QPS的“流量洪峰”征服之旅
  • Linux软件编程:进程与线程(线程)
  • ruoyi-vue(十一)——代码生成
  • 最长回文子串问题:Go语言实现及复杂度分析
  • vulnhub-lampiao靶机渗透
  • 科目二的四个电路
  • 实时视频延迟优化实战:RTSP与RTMP播放器哪个延迟更低?
  • 机器学习--数据清洗
  • 音频分类标注工具
  • RAC环境redo在各节点本地导致数据库故障恢复---惜分飞
  • python pandas库 series如何使用
  • React 19 核心特性
  • Java基础 8.17
  • Android面试指南(二)
  • 如何让AI视频模型(如Veo)开口说中文?一个顶级提示词的深度拆解
  • 深入解析Tomcat Processor的协议处理机制
  • Linux Shell定时检查日期执行Python脚本
  • 安装pytorch3d后报和本机cuda不符
  • 照相机标定-动手学计算机视觉16
  • 计算机网络 Cookie 和 Session 的区别详解
  • 【递归、搜索与回溯算法】记忆化搜索