构造HTTP请求 以及 关于HTTPS的加密

news2024/11/19 21:19:11

1.构造HTTP请求

构造HTTP请求有很多种方式.使用html,使用jQuery,使用socket…等等.

这里我们介绍两种.

  1. 使用html
  2. 使用jQuery

1.1.使用html构造HTTP请求

使用html构造HTTP请求,要使用到 form 标签.

这里form标签中的属性有两个.

  1. action :填写数据要返送到的地址.(URL)
  2. method :填写数据发送使用的方法.
    • 这里的方法只有两个 : (GET/POST)

form标签中使用input标签来组织数据.这里input中的属性以下几个.

  1. type
    • text 普通文本
    • password 密码文本
    • submit 按钮
  2. name
    • 提交数据后 数据的KEY
  3. value
    • 按钮上显示的数据

这是一个GET请求.(这里将数据发送到搜狗首页)

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>GET</title>
    </head>
    <body>
        <!--action:url      method:提交方法(只有GET和POST,不区分大小写)-->
        <form action="https://www.sogou.com/index.html" method="get">
            <!--    input中的 name 就是提交后的数据的key-->
            username: <input type="text" name="username"><br>
            password: <input type="password" name="password"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

把method中的GET改为POST,这个请求就变为了一个POST请求.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>POST</title>
    </head>
    <body>
        <!--action:url      method:提交方法(只有GET和POST,不区分大小写)-->
        <!--将method中的GET改为POST,这个请求就变为了POST请求-->
        <form action="https://www.sogou.com/index.html" method="POST">
            <!--    input中的 name 就是提交后的数据的key-->
            username: <input type="text" name="username"><br>
            password: <input type="password" name="password"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

1.2.使用jQuery构造HTTP请求

这里我们要使用jQuery中的Ajax函数来构造请求.

Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)

1.2.1.Ajax的异步等待

  1. 同步阻塞等待(Scanner)
    • 就是调用了一个方法以后,不再干别的事情
    • 阻塞等待到这个方法结束.得到结果了再继续执行自己的操作
  2. 同步非阻塞等待
    • 调用一个方法后,调用者去干别的事情
    • 但是会时不时回来查看这个方法有没有执行结束.结束了就获取结果
  3. 异步等待(ajax)
    • 调用方法以后,就不再管这个方法了,专心干别的事情
    • 被调用的方法结束后会给调用者反馈.调用者就知道方法结束了,并得到了结果.
  • 虽然 2 和 3类似.但是很明显 2对调用者的开销更大,而 3对调用者来说就更轻量.

简单理解:

  • 同步 :结果是调用者主动关注的.
  • 异步 :结果不是调用者主动关注的.
  • 阻塞 :等待过程中不会干别的事情
  • 非阻塞 :等待过程中会干别的事情

1.2.2.使用jQuery

要使用jQuery,我们就要有jQuery.

有jQuery的方式有很多种.我们这里直接采用 script标签+jQuery的网络链接来使用jQuery.

<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
  • $ : 就是jQuery的本体.
  • $.ajax() : 使用jQuery调用ajax方法
  • ajax中的属性
    • type: 填写发送请求使用的方法.
      • 这里不仅有GET/POST,这里还可以是其他的方法.
    • url: 填写请求发送的目的地址.
    • success: 调用回调函数.没有发生错误的时候,就会调用这个方法.
    • error: 同上,是回调函数.发送错误会被调用.

同样向搜狗首页发送GET请求.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>jQuery</title>
    </head>
    
    <!--引入jQuery-->
    <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
    <script>
        <!--    通过$来调用ajax函数-->
        $.ajax({
            //ajax不仅支持GET和POST,也支持其他的
            type: 'get',
            url: 'https://www.sogou.com/index.html',
            success: function (body) {
                //success 对应一个回调函数
                //这个函数就会在正确获取到HTTP响应之后,来调用.
                //"异步"
                //回调函数的参数,就是HTTP响应的body部分.
                console.log("获取到响应数据! " + body);
            },
            error: function () {
                //error 也对应一个回调函数
                //这个函数会在请求失败之后触发
                //"异步"
                console.log("获取响应失败!");
            }
        });
    </script>
    
    <!--正常来说这里会出现错误因为浏览器禁止ajax进行跨域访问(跨越多个域名/多个服务器)-->
    <!--如果对方服务器返回的响应中带有相关的响应头,允许跨域访问操作,就是可以正常被浏览器展示的-->
</html>

修改type的值为post,就变为了POST请求.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>jQuery</title>
    </head>
    
    <!--引入jQuery-->
    <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
    <script>
        <!--    通过$来调用ajax函数-->
        $.ajax({
            //ajax不仅支持GET和POST,也支持其他的
            type: 'get',
            url: 'https://www.sogou.com/index.html',
            success: function (body) {
                //success 对应一个回调函数
                //这个函数就会在正确获取到HTTP响应之后,来调用.
                //"异步"
                //回调函数的参数,就是HTTP响应的body部分.
                console.log("获取到响应数据! " + body);
            },
            error: function () {
                //error 也对应一个回调函数
                //这个函数会在请求失败之后触发
                //"异步"
                console.log("获取响应失败!");
            }
        });
    </script>
    
    <!--正常来说这里会出现错误因为浏览器禁止ajax进行跨域访问(跨越多个域名/多个服务器)-->
    <!--如果对方服务器返回的响应中带有相关的响应头,允许跨域访问操作,就是可以正常被浏览器展示的-->
</html>

1.2.3.Ajax小tap

这里发送请求之后,大家会发现并没有跳转到搜狗首页.会抓包的同学可以观察到,数据报已经返回了.并且状态码也是 200 .那为什么会没有显示呢.

其实是因为,浏览器是禁止ajax进行跨域访问(跨越多个域名/多个服务器)的,我们这里访问搜狗首页其实就跨域访问了.所以浏览器没有展示页面.但也不是完全不可以.

如果对方服务器返回的响应中带有相关的响应头, 允许跨域访问操作 ,那么就可以正常被浏览器展示了.

2.关于HTTPS.

  • HTTPS相当于HTTP的孪生兄弟.
  • HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况.
  • HTTPS在HTTP的基础上, 引入了一个加密层.(这里的加密不是为了防止被获取,主要是防止篡改)

2.1.关于篡改

关于HTTP的篡改,最广为人知的就是 “运营商劫持” .

运营商劫持有很多种表现.主要因为是明文传输,所以很容易篡改.

例如:我在网页上要下载一个软件.点击了下载链接以后,跳出来的下载链接不是我要下载的软件.这个时候就发生了 运营商劫持 .我要下载的链接被篡改了.

如果只是这样还不算太危险,但是如果我们要传输密码之类的,因为是明文.所以就会很不安全.

2.2.关于HTTPS的加密

“加密” 是什么

加密就是把明文(要传输的信息)进行一系列变换, 生成密文. 解密就是把密文再进行一系列变换, 还原成明文.

HTTPS 要保证数据安全, 就需要进行 “加密”. 网络传输中不再直接传输明文了, 而是加密之后的 “密文”. 加密的方式有很多, 但是整体可以分成两大类: 对称加密 和 非对称加密

2.2.1.对称加密

对称加密就是客户端和服务端持有同一个 “密钥”, 通过这个 “密钥” 能把明文加密成密文, 并且也能把密文解密成明文.这样就可以在传输中使用密文传输.

但是这里也是有困难的 理想很丰满,现实很骨感

在这里插入图片描述

  • 不能所有的客户端和服务端使用同一个 “密钥”.
    • 如果所有的都使用同一个 “密钥” 的话,那黑客只需要注册一个客户端就知道了密钥.
    • 这时,所有的美好幻想都是无用的了.

既然不能所有的使用同一个密钥,那就让客户端来约定密钥.

在这里插入图片描述

  • 每个都有单独的密钥的时候,就会被黑客在建立连接的阶段获取到传输的 “密钥” .
    • 让每个客户端和服务端建立连接的时候约定好 “密钥”.
    • 但是这个时候,约定密钥的时候就需要使用明文传输.
    • 黑客在约定密钥的阶段获取到了密钥.
    • 后续美好的幻想又是无用的了.

这样了解下来,我们使用对称加密就没有达到我们想要的效果. 于是大佬又提出了新的加密方式: 非对称加密

2.2.2.非对称加密

非对称加密要用到两个密钥, 一个 “公钥”, 一个 “私钥”.

  • 客户端明文向服务端询问"公钥".
  • 服务器将公钥发送给客户端.
  • 客户端通过 “公钥”,将约定好的 "密钥"加密 发送给服务端.
  • 服务端接收到以后加密的"密钥" 以后, 通过私钥解密.
  • 这样双方就得到了密钥.就可以通过密钥传输数据了.

为什么不直接使用公钥和私钥进行数据传输. 那是因为公钥和私钥的运算速度要比对称慢很多.


中间人攻击–现实很骨感.

当我们觉得这样很安全的时候. “黑客” 又出现了.

黑客在客户端向服务端询问公钥的时候切入:

  • 黑客自己也 有一组 "公钥"和 “私钥”.
  • 当客户端向服务端询问公钥的时候,黑客就将自己的公钥发送给客户端
  • 客户端拿到这个公钥 傻傻分不清是谁发给他的.但还是把自己约定的 “密钥” 通过这个"安全的公钥" 进行加密并发送给 “服务端”(黑客).
  • 黑客得到这个数据 通过自己的私钥进行解密.就得到了服务端和客户端进行通话的"密钥".
  • 然后黑客再将这个密钥通过 服务端给的公钥进行加密.发送给服务端.
  • 这样黑客就神不知鬼不觉的获取到了密钥.

2.2.2.1.证书

为了防止这种情况.于是有了工信机构.在搭建一个HTTPS网站的时候,首先要在CA机构(工信机构)先申请一个证书.(作为安全的代表).这个证书包含了刚才的公钥, 也包含了网站的身份信息.

  • 在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书.
  • 客户端获取到证书之后,会对证书进行校验(防止证书是伪造的)
    • 操作系统中已内置的受信任的证书发布机构.所以验证起来很简单.
  • 验证了证书以后,再验证数据是否有被篡改.
    • 具体过程: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数 据摘要), 设为 hash1. 然后计算整个证书的 hash 值, 设为 hash2. 对比 hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的.

这样就解决了上述的黑客入侵的问题.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生 | Kubernetes 实战】08、零故障升级之 Pod 健康探测——启动、存活、就绪探测

目录 一、Pod容器健康探测 1.1 为什么要对容器做探测&#xff1f; 默认的健康检查 探测类型 检查机制 探测结果 Pod 探针相关的属性 两种探针区别 1.2 启动探测 startupprobe exec 模式 tcpsocket 模式 httpget 模式 1.3 存活性探测 livenessProbe 通过 exec …

C++const修饰成员函数

#include "iostream"using namespace std;//常函数class Person { public://this指针的本质 是指针常量 指针的指向是不可以修改的//const Person * const this//在成员函数后面加const&#xff0c;修饰的是this的指向&#xff0c;让指针指向的值也不可以修改void …

纤维二糖-聚乙二醇-羟基Cellobiose-PEG-OH羟基-PEG-纤维二糖

纤维二糖-聚乙二醇-羟基Cellobiose-PEG-OH羟基-PEG-纤维二糖 中文名称&#xff1a;纤维二糖-羟基 英文名称&#xff1a;Cellobiose-OH 别称&#xff1a;羟基修饰纤维二糖&#xff0c;羟基-纤维二糖 羟基&#xff08;oxhydryl&#xff09;是一种常见的极性基团&#xff0c;化…

深入场景痛点,制造业数据应用思考与实践

数字化转型是我国制造业进一步创新式发展的关键&#xff0c;决定了企业在未来生存和发展的态势。 但对于企业而言&#xff0c;如何以低耗能、低成本、高效率的方式加快制造业转型升级的步伐&#xff0c;仍然是众多制造企业需要解决的问题。 深入制造企业数字化转型的场景&…

#Spring-boot高级

一、SpringBoot 整合 Mybatis 1、SpringBoot 整合 Mybatis MyBatis 帮助我们快速集成 SpringBoot 提供的一个组件包&#xff08;mybatis-spring-boot-starter)&#xff0c;使用这个组件可以做到以下几点&#xff1a; 自动检测现有的DataSource将创建并注册SqlSessionFactory…

从工地转行网络安全工程师,工资翻了好几倍,我想和大家聊聊我的经历

成功的从工地转行到办公室办公也有一年了&#xff0c;楼主就来说说&#xff0c;从工地到白领的过渡吧&#xff0c;这其中历经艰辛&#xff0c;最终终达成目标。没错&#xff0c;楼主现在成为了一位网络安全工程师… 先说说为什么转行吧&#xff0c;身边很多做土木工程的都转行…

还在一张张打印CAD图纸吗

用CAD打印少些图纸可以一张张的打印&#xff0c;但是需要打印上百甚至上千张图纸的时候一张张打印就不知道需要用多久的打印时间了&#xff0c;那么在CAD梦想画图软件中有一个批量打印图纸的功能&#xff0c;能节约很大一部分打印时间 操作步骤 1.在网上下载CAD梦想画图 2.用…

Ansys Lumerical | 行波马赫曾德尔调制器的仿真设计与优化

说明 本案例将Lumerical和HFSS在行波MZM调制器建模中的功能与optiSLang相结合&#xff0c;提供了强大的优化能力以寻找最佳性能设计。 下载 联系工作人员获取附件 综述 本案例建立在已有的硅波导建模实例&#xff08;Ansys Lumerical 行波 Mach-Zehnder 调制器仿真分析&#x…

知乎zse-96算法-jsrpc方案

文章目录 1.git 下载exe文件2. 控制台执行JsEnv.js,建立连接3.抠取 加密js代码4. python 调用rpc临时有知乎需求,就研究了一下知乎搜索接口,发现主要是zse-96算法难,补环境又有很多坑,又想快速解决问题,就有了用jsrpc来解决的想法,后面有时间了就研究一下再发一个补环境…

JavaScript中的sessionStorage

JavaScript中的sessionStorage 该文章需要联系这篇文章学习&#xff1a;JavaScript中的localStorage 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果…

[C++]类和对象【上篇】

​ &#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode 文章目录1.面向…

归并排序 (递归+非递归)

文章目录1. 归并排序 递归1.基本思想2. 使用两个函数完成归并3. 递归结束条件4.时间复杂度与空间复杂度计算1. 时间复杂度2. 空间复杂度5. 代码2. 归并排序 非递归1. 思想2. 越界问题1. .end1 beign2 end2 越界方式 1方式 2整体拷贝与拷贝一部分&#xff0c;归并一部分的区别2.…

数据库与身份认证:数据库的基本概念

什么是数据库 数据库&#xff08;database&#xff09;是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界&#xff0c;充斥着大量的数据。数据的来源有很多&#xff0c;比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据&…

【知识图谱】(task1)知识图谱概论

note 知识图谱技术要素 文章目录note一、语言与知识二、知识图谱的起源三、知识图谱的价值四、知识图谱的技术内涵4.1 知识图谱是交叉领域4.2 技术内涵&#xff08;1&#xff09;基于图的表示学习&#xff08;2&#xff09;图数据存储和查询&#xff08;3&#xff09;知识图谱…

企业庆典年会活动如何邀约媒体记者到现场报道

媒体邀约是指企业或者是公司根据其发生的公关事件&#xff0c;比如展览展会、新品上市以及合作签约等事宜&#xff0c;向特定的媒体发出邀请&#xff0c;如果邀请得到媒体的通过之后&#xff0c;那么相应的媒体就会到公司的现场进行实时采访和报道&#xff0c;之后还会在国内的…

node.js的四种内置模块

目录 1、node.js内置模块的概念 2、fs内置模块 3、path内置模块 4、url内置模块 5、http内置模块 1、node.js内置模块的概念 node.js的内置模块也叫作node.js的核心模块&#xff0c;它是node.js自带的模块&#xff0c;在下载了node.js后就会有的&#xff0c;并不需要从外…

猿如意中的【Code:: Blocks】工具详情介绍

文章目录一、工具名称二、下载安装渠道2.1 什么是猿如意&#xff1f;2.2 如何下载猿如意&#xff1f;2.3 如何在猿如意中下载开发工具Code:: Blocks&#xff1f;三、工具介绍四、Code::Blocks 功能介绍4.1、VC 6.04.2、Code::Blocks4.3、Dev-C4.4 Visual Studio4.5、C-Free五、…

BF706和BF609的Flash Program新技巧,可以使用第三方插件

作者的话 CCES来做Flash Program&#xff0c;需要CMD&#xff0c;然后敲一大堆的命令&#xff0c;刚开始搞的时候&#xff0c;会觉得很麻烦&#xff0c;那么是否有更简单的办法呢&#xff1f;在Blackfin处理器里&#xff0c;我找到了一个第三方插件&#xff0c;用这个插件就可…

Uniapp 如何用离线打包工程制作自定义调试基座

如何用离线打包工程制作自定义调试基座 Tips⚠️&#xff1a; 确保版本一致,请确保从HBuilderX导出的打包资源的HBuilderX的版本号和App离线SDK发布的版本号是一致的&#xff0c;如下2张图里的版本号&#xff1a; 打开原生iOS工程 1、在打包原生工程里找到 control.xml文件&a…

单向链表理解——java

概述 单线链表&#xff1a;单向链表又叫单链表&#xff0c;是链表的一种。由节点构成&#xff0c;head指针指向第一个称为表头节点,而终止指向最后一个null指针 特点 链表连接的方向都是单向的链表的访问要通过顺序从头部开始链表是使用指针进行构造的列表是由一个一个节点组…