高级PHP应用程序漏洞审核技术【一】

高级PHP应用程序漏洞审核技术【一】

目录

高级PHP应用程序漏洞审核技术【一】


 

 

本文章向大家介绍高级PHP应用程序漏洞审核技术【一】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

前言

小编入门代码审计时看的几篇写的比较经典的PDF文档之一,分享出来希望能帮助到想学习代码审计的小伙伴。

 

 

一、前言 PHP是一种被广泛使用的脚本语言,尤其适合于web开发。具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应用,包括Yahoo、sina、163、sohu等大型门户网站。而且很多具名的web应用系统(包括bbs,blog,wiki,cms等等)都是使用php开发的, Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。随着web安全的热点升级,php应用程序的代码安全问题也逐步兴盛起来,越来越多的安全人员投入到这个领域,越来越多的应用程序代码漏洞被披露。

针对这样一个状况,很多应用程序的官方都成立了安全部门,或者雇佣安全人员进行代码审计,因此出现了很多自动化商业化的代码审计工具。也就是这样的形势导致了一个局面:大公司的产品安全系数大大的提高,那些很明显的漏洞基本灭绝了,那些大家都知道的审计技术都无用武之地了。我们面对很多工具以及大牛扫描过n遍的代码,有很多的安全人员有点悲观,而有的官方安全人员也非常的放心自己的代码,但是不要忘记了“没有绝对的安全”,我们应该去寻找新的途径挖掘新的漏洞。本文就给介绍了一些非传统的技术经验和大家分享。 另外在这里特别说明一下本文里面很多漏洞都是来源于网络上牛人和朋友们的分享,在这里需要感谢他们,:)

二、传统的代码审计技术 WEB应用程序漏洞查找基本上是围绕两个元素展开:变量与函数。也就是说一漏洞的利用必须把你提交的恶意代码通过变量经过n次变量转换传递,最终传递给目标函数执行,还记得MS那句经典的名言吗?“一切输入都是有害的”。这句话只强调了变量输入

很多程序员把“输入”理解为只是gpc[$_GET,$_POST,$_COOKIE],但是变量在传递过程产生了n多的变化。导致很多过滤只是个“纸老虎”!我们换句话来描叙下代码安全:“一切进入函数的变量是有害的”。 PHP代码审计技术用的最多也是目前的主力方法:静态分析,主要也是通过查找容易导致安全漏洞的危险函数,常用的如grep,findstr等搜索工具,很多自动化工具也是使用正则来搜索这些函数。下面列举一些常用的函数,也就是下文说的字典(暂略)。

但是目前基本已有的字典很难找到漏洞,所以我们需要扩展我们的字典,这些字典也是本文主要探讨的。 其他的方法有:通过修改PHP源代码来分析变量流程,或者hook危险的函数来实现对应用程序代码的审核,但是这些也依靠了我们上面提到的字典。

三、PHP版本与应用代码审计 到目前为止,PHP主要有3个版本:php4、php5、php6,使用比例大致如下:php4 68%2000-2007,No security fixes after 2008/08,最终版本是php4.4.9、php5 32%、2004-present,Now at version 5.2.6(PHP 5.3 alpha1 released!)php6、目前还在测试阶段,变化很多做了大量的修改,取消了很多安全选项如magic_quotes_gpc。(这个不是今天讨论的范围)

由于php缺少自动升级的机制,导致目前PHP版本并存,也导致很多存在漏洞没有被修补。这些有漏洞的函数也是我们进行WEB应用程序代码审计的重点对象,也是我们字典重要来源。

四、其他的因素与应用代码审计 很多代码审计者拿到代码就看,他们忽视了“安全是一个整体”,代码安全很多的其他因素有关系,比如上面我们谈到的PHP版本的问题,比较重要的还有操作系统类型(主要是两大阵营win/*nix),WEB服务端软件(主要是iis/apache两大类型)等因素。这是由于不同的系统不同的WEB SERVER有着不同的安全特点或特性,下文有些部分会涉及。 所以我们在做某个公司WEB应用代码审计时,应该了解他们使用的系统,WEB服务端软件,PHP版本等信息。

五、扩展我们的字典 下面将详细介绍一些非传统PHP应用代码审计一些漏洞类型和利用技巧。

5.1 变量本身的key 说到变量的提交很多人只是看到了GET/POST/COOKIE等提交的变量的值,但是忘记了有的程序把变量本身的key也当变量提取给函数处理。 --code------------------------------------------------------------------------- <?php //key.php?aaaa"aaa=1&bb"b=2 //print_R($_GET); foreach ($_GET AS $key => $value) { print $key."n"; } ?> ------------------------------------------------------------------------------- 上面的代码就提取了变量本身的key显示出来,单纯对于上面的代码,如果我们提交URL: --code------------------------------------------------------------------------- key.php?<script>alert(1);</script>=1&bbb=2 ------------------------------------------------------------------------------- 那么就导致一个xss的漏洞,扩展一下如果这个key提交给include()等函数或者sql查询呢?:) +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 +++++++++++++++++++++++++

5.2 变量覆盖(variable-overwrite) 很多的漏洞查找者都知道extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指定函数可以导致变量覆盖,但是还有很多其他情况导致变量覆盖的如:

5.2.1 遍历初始化变量 请看如下代码: --code------------------------------------------------------------------------- <?php //var.php?a=fuck $a="hi"; foreach($_GET as $key => $value) { $$key = $value; } print $a; ?> ------------------------------------------------------------------------------- 很多的WEB应用都使用上面的方式(注意循环不一定是foreach),如Discuz!4.1的WAP部分的代码: --code------------------------------------------------------------------------- $chs = ""; if($_POST && $charset != "utf-8") { $chs = new Chinese("UTF-8", $charset); foreach($_POST as $key => $value) { $$key = $chs->Convert($value); } unset($chs); ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 +++++++++++++++++++++++++

5.2.2 parse_str()变量覆盖漏洞(CVE-2007-3205)、mb_parse_str() --code------------------------------------------------------------------------- //var.php?var=new $var = "init"; parse_str($_SERVER["QUERY_STRING"]); print $var; ------------------------------------------------------------------------------- 该函数一样可以覆盖数组变量,上面的代码是通过$_SERVER["QUERY_STRING"]来提取变量的,对于指定了变量名的我们可以通过注射“=”来实现覆盖其他的变量: --code------------------------------------------------------------------------- //var.php?var=1&a[1]=var1%3d222 $var1 = "init"; parse_str($a[$_GET["var"]]); print $var1; ------------------------------------------------------------------------------- 上面的代码通过提交$var来实现对$var1的覆盖。 +++++++++++++++++++++++++ 漏洞审计策略(parse_str) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符parse_str +++++++++++++++++++++++++ +++++++++++++++++++++++++ 漏洞审计策略(mb_parse_str) ------------------------- PHP版本要求:php4<4.4.7 php5<5.2.2 系统要求:无 审计策略:查找字符mb_parse_str +++++++++++++++++++++++++

5.2.3 import_request_variables()变量覆盖漏洞(CVE-2007-1396) --code------------------------------------------------------------------------- //var.php?_SERVER[REMOTE_ADDR]=10.1.1.1 echo "GLOBALS ".(int)ini_get("register_globals")."n"; import_request_variables("GPC"); if ($_SERVER["REMOTE_ADDR"] != "10.1.1.1") die("Go away!"); echo "Hello admin!"; ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略(import_request_variables) ------------------------- PHP版本要求:php4<4.4.1 php5<5.2.2 系统要求:无 审计策略:查找字符import_request_variables +++++++++++++++++++++++++

5.2.4 PHP5 Globals 从严格意义上来说这个不可以算是PHP的漏洞,只能算是一个特性,测试代码: --code------------------------------------------------------------------------- <? // register_globals =ON //foo.php?GLOBALS[foobar]=HELLO php echo $foobar; ?> ------------------------------------------------------------------------------- 但是很多的程序没有考虑到这点,请看如下代码: --code------------------------------------------------------------------------- //为了安全取消全局变量 //var.php?GLOBALS[a]=aaaa&b=111 if (ini_get("register_globals")) foreach($_REQUEST as $k=>$v) unset(${$k}); print $a; print $_GET[b]; ------------------------------------------------------------------------------- 如果熟悉WEB2.0的攻击的同学,很容易想到上面的代码我们可以利用这个特性进行crsf 攻击。 +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 +++++++++++++++++++++++++ 5.3 magic_quotes_gpc与代码安全

5.3.1 什么是magic_quotes_gpc 当打开时,所有的 "(单引号),"(双引号),(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。还有很多函数有类似的作用 如:addslashes()、mysql_escape_string()、 mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤变量,这看上去很安全。很多漏洞查找者或者工具遇到些函数过滤后的变量直接就放弃,但是就在他们放弃的同时也放过很多致命的安全漏洞。 :)

5.3.2 哪些地方没有魔术引号的保护

1) $_SERVER变量 PHP5的$_SERVER变量缺少magic_quotes_gpc的保护,导致近年来X-Forwarded-For的漏洞猛暴,所以很多程序员考虑过滤X-Forwarded-For,但是其他的变量呢? +++++++++++++++++++++++++ 漏洞审计策略($_SERVER变量) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符_SERVER +++++++++++++++++++++++++ 2) getenv()得到的变量(使用类似$_SERVER变量) +++++++++++++++++++++++++ 漏洞审计策略(getenv()) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符getenv +++++++++++++++++++++++++

3) $HTTP_RAW_POST_DATA与PHP输入、输出流主要应用与soap/xmlrpc/webpublish功能里,请看如下代码: --code------------------------------------------------------------------------- if ( !isset( $HTTP_RAW_POST_DATA ) ) { $HTTP_RAW_POST_DATA = file_get_contents( "php://input" ); } if ( isset($HTTP_RAW_POST_DATA) ) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA); ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略(数据流) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符HTTP_RAW_POST_DATA或者php://input +++++++++++++++++++++++++

4) 数据库操作容易忘记"的地方如:in()/limit/order by/group by 如Discuz!<5.0的pm.php: --code------------------------------------------------------------------------- if(is_array($msgtobuddys)) { $msgto = array_merge($msgtobuddys, array($msgtoid)); ...... foreach($msgto as $uid) { $uids .= $comma.$uid; $comma = ","; } ...... $query = $db->query("SELECT m.username, mf.ignorepm FROM {$tablepre}members m LEFT JOIN {$tablepre}memberfields mf USING(uid) WHERE m.uid IN ($uids)"); ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找数据库操作字符(select,update,insert等等) +++++++++++++++++++++++++

5.3.3 变量的编码与解码 一个WEB程序很多功能的实现都需要变量的编码解码,而且就在这一转一解的传递过程中就悄悄的绕过你的过滤的安全防线。 这个类型的主要函数有:

1) stripslashes() 这个其实就是一个decode-addslashes() 2) 其他字符串转换函数: base64_decode -- 对使用 MIME base64 编码的数据进行解码 base64_encode -- 使用 MIME base64 对数据进行编码 rawurldecode -- 对已编码的 URL 字符串进行解码 rawurlencode -- 按照 RFC 1738 对 URL 进行编码 urldecode -- 解码已编码的 URL 字符串 urlencode -- 编码 URL 字符串 ...... (另外一个 unserialize/serialize) 3) 字符集函数(GKB,UTF7/8...)如iconv()/mb_convert_encoding()等 目前很多漏洞挖掘者开始注意这一类型的漏洞了,如典型的urldecode: --code------------------------------------------------------------------------- $sql = "SELECT * FROM article WHERE articleid="".urldecode($_GET[id])."""; ------------------------------------------------------------------------------- 当magic_quotes_gpc=on时,我们提交?id=%2527,得到sql语句为: --code------------------------------------------------------------------------- SELECT * FROM article WHERE articleid=""" ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找对应的编码函数 +++++++++++++++++++++++++

5.3.4 二次攻击(详细见附录[1]) 1) 数据库出来的变量没有进行过滤 2) 数据库的转义符号: * mysql/oracle转义符号同样是(我们提交"通过魔术引号变化为",当我们update进入数据库时,通过转义变为") * mssql的转义字符为"(所以我们提交"通过魔术引号变化为",mssql会把它当为一个字符串直接处理,所以魔术引号对于mssql的注射没有任何意义) 从这里我们可以思考得到一个结论:一切进入函数的变量都是有害的,另外利用二次攻击我们可以实现一个webrootkit,把我们的恶意构造直接放到数据库里。我们应当把这样的代码看成一个vul? +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:通读代码 +++++++++++++++++++++++++

5.3.5 魔术引号带来的新的安全问题 首先我们看下魔术引号的处理机制: [-->\,"-->","-->",null-->] 这给我们引进了一个非常有用的符号“”,“”符号不仅仅是转义符号,在WIN系统下也是目录转跳的符号。这个特点可能导致php应用程序里产生非常有意思的漏洞: 1) 得到原字符(",,",null]) --code------------------------------------------------------------------------- $order_sn=substr($_GET["order_sn"], 1); //提交 " //魔术引号处理 " //substr " $sql = "SELECT order_id, order_status, shipping_status, pay_status, ". " shipping_time, shipping_id, invoice_no, user_id ". " FROM " . $ecs->table("order_info"). " WHERE order_sn = "$order_sn" LIMIT 1"; ------------------------------------------------------------------------------- 2) 得到“”字符 --code------------------------------------------------------------------------- $order_sn=substr($_GET["order_sn"], 0,1); //提交 " //魔术引号处理 " //substr $sql = "SELECT order_id, order_status, shipping_status, pay_status, ". " shipping_time, shipping_id, invoice_no, user_id ". " FROM " . $ecs->table("order_info"). " WHERE order_sn = "$order_sn" and order_tn="".$_GET["order_tn"]."""; ------------------------------------------------------------------------------- 提交内容: --code------------------------------------------------------------------------- ?order_sn="&order_tn=%20and%201=1/* ------------------------------------------------------------------------------- 执行的SQL语句为: --code------------------------------------------------------------------------- SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM order_info WHERE order_sn = "" and order_tn=" and 1=1/*" ------------------------------------------------------------------------------- +++++++++++++++++++++++++ 漏洞审计策略 ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符串处理函数如substr或者通读代码 +++++++++++++++++++++++++

5.3.6 变量key与魔术引号
我们最在这一节的开头就提到了变量key,PHP的魔术引号对它有什么影响呢?
--code-------------------------------------------------------------------------
<?php
//key.php?aaaa"aaa=1&bb"b=2
//print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key."n";
}
?>
-------------------------------------------------------------------------------
1) 当magic_quotes_gpc = On时,在php5.24下测试显示:
aaaa"aaabb"b从上面结果可以看出来,在设置了magic_quotes_gpc = On下,变量key受魔术引号影响。但是在php4和php<5.2.1的版本中,不处理数组第一维变量的key,测试代码如下:
--code-------------------------------------------------------------------------
<?php
//key.php?aaaa"aaa[bb"]=1
print_R($_GET);
?>
-------------------------------------------------------------------------------
结果显示:
Array ( [aaaa"aaa] => Array ( [bb"] => 1 ) )
数组第一维变量的key不受魔术引号的影响。
+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:php4和php<5.2.1
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++
2) 当magic_quotes_gpc = Off时,在php5.24下测试显示:
aaaa"aaabb"b对于magic_quotes_gpc = Off时所有的变量都是不安全的,考虑到这个,很多程序都通过addslashes等函数来实现魔术引号对变量的过滤,示例代码如下:
--code-------------------------------------------------------------------------
<?php
//keyvul.php?aaa"aa=1"
//magic_quotes_gpc = Off
if (!get_magic_quotes_gpc())
{
$_GET = addslashes_array($_GET);
}
function addslashes_array($value)
{
return is_array($value) ? array_map("addslashes_array", $value) : addslashes($value);
}
print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key;
}
?>
-------------------------------------------------------------------------------
以上的代码看上去很完美,但是他这个代码里addslashes($value)只处理了变量的具体的值,但是没有处理变量本身的key,上面的代码显示结果如下:
Array
(
[aaa"aa] => 1"
)
aaa"aa
+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++

 

 

 

 

 

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

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

相关文章

Xilinx FPGA SPIx4 配置速度50M约束语句(Vivado开发环境)

qspi_50m.xdc文件&#xff1a; set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] set_property CONFIG_VOLTAGE 3.3 [curren…

轻量封装WebGPU渲染系统示例<21>- 3D呈现元胞自动机之生命游戏(源码)

实现原理: 基本PBR光照与gpu compute计算 尽量用数据化/语义化的松散描述数据的方式来呈现相关对象逻辑 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLife3DPBR.ts当前示例运行效果: 其他效果截图: 此示…

解决方案 |法大大电子合同推动汽车后市场多元数智化发展

近日&#xff0c;商务部等9部门联合发布《关于推动汽车后市场高质量发展的指导意见》&#xff08;以下简称《指导意见》&#xff09;&#xff0c;明确了汽车后市场发展的总体目标和主要任务&#xff0c;系统部署推动汽车后市场高质量发展&#xff0c;促进汽车后市场规模稳步增长…

Day26力扣打卡

打卡记录 搜索旋转排序数组&#xff08;二分&#xff09; 链接 class Solution {int findMin(vector<int> &nums) {int left -1, right nums.size() - 1; // 开区间 (-1, n-1)while (left 1 < right) { // 开区间不为空int mid left (right - left) / 2;if…

easyexcel==省市区三级联动

省市区三级联动&#xff0c;不选前面的就没法选后面的 package com.example.demoeasyexcel.jilian2; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import org.apache.poi.ss.use…

【Java 进阶篇】Java Web 开发之 JQuery 快速入门

嗨&#xff0c;各位小伙伴们&#xff01;欢迎来到 Java Web 开发的继续学习之旅。在前面的博客中&#xff0c;我们学习了 Servlet、JSP、Filter、Listener 等基础知识&#xff0c;今天我们将进入前端领域&#xff0c;学习一下如何使用 JQuery 来简化和优化我们的前端开发。 1.…

SpringBoot_01

Spring https://spring.io/ SpringBoot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。 SpringBootWeb入门 需求&#xff1a;使用SpringBoot开发一个web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~~~"。 步骤…

学习pytorch15 优化器

优化器 官网如何构造一个优化器优化器的step方法coderunning log出现下面问题如何做反向优化&#xff1f; 官网 https://pytorch.org/docs/stable/optim.html 提问&#xff1a;优化器是什么 要优化什么 优化能干什么 优化是为了解决什么问题 优化模型参数 如何构造一个优化器…

postgis函数学习

1.特定功能的SQL 转为完整的json&#xff0c;前端调用用json_build_object、jsonb_agg等函数&#xff0c;处理mass_test表 select json_build_object(type,FetureCollection,features,jsonb_agg(st_asgeojson(mt.*)::json)) from mass_test mt获取图形边界范围的坐标 select…

企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理

计算机技术的不断发展给企业的生产生活提供了极大便利&#xff0c;但也为企业带来了网络安全威胁。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的所有工作无法正常开展&#xff0c;给企业…

docker去掉sudo权限方法

查看用户组及成员 sudo cat /etc/group | grep docker 可以添加docker组 sudo groupadd docker 添加用户到docker组 sudo gpasswd -a huangxiujie docker 增加读写权限 sudo chmod arw /var/run/docker.sock 重启docker sudo systemctl restart docker

自动化测试测试框架封装改造

PO模式自动化测试用例 PO设计模式是自动化测试中最佳的设计模式&#xff0c;主要体现在对界面交互细节的封装&#xff0c;在实际测试中只关注业务流程就可以了。 相较于传统的设计&#xff0c;在新增测试用例后PO模式有如下优点&#xff1a; 1、易读性强 2、可扩展性好 3、…

代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 力扣题目链接(opens new window) 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须…

postgresql 实现计算日期间隔排除周末节假日方案

前置条件&#xff1a;需要维护一张节假日日期表。例如创建holiday表保存当年假期日期 CREATE TABLE holiday (id BIGINT(10) ZEROFILL NOT NULL DEFAULT 0,day TIMESTAMP NULL DEFAULT NULL,PRIMARY KEY (id) ) COMMENT假期表 COLLATEutf8mb4_0900_ai_ci ;返回日期为xx日xx时x…

Windows查看端口占用情况

Windows如何查看端口占用情况 方法1. cmd命令行执行netstat命令&#xff0c;查看端口占用情况 netstat -ano 以上命令输出太多信息&#xff0c;不方便查看&#xff0c;通过如下命令搜索具体端口占用情况&#xff0c;例如&#xff1a;8080端口 netstat -ano | findstr "…

Ubuntu LTS 坚持 10 年更新不动摇

Linux 内核开发者 Jonathan Corbet 此前在欧洲开源峰会上宣布&#xff0c;LTS 内核的支持时间将从六年缩短至两年&#xff0c;原因在于缺乏使用和缺乏支持。稳定版内核维护者 Greg Kroah-Hartman 也表示 “没人用 LTS 内核”。 近日&#xff0c;Ubuntu 开发商 Canonical 发表博…

VB.NET—Bug调试(参数话查询、附近语法错误)

目录 前言: BUG是什么&#xff01; 事情的经过: 过程: 错误一: 错误二: 总结: 前言: BUG是什么&#xff01; 在计算机科学中&#xff0c;BUG是指程序中的错误或缺陷&#xff0c;它通过是值代码中的错误、逻辑错误、语法错误、运行时错误等相关问题&#xff0c;这些问题…

基于51单片机RFID射频门禁刷卡系统设计

**单片机设计介绍&#xff0c; 基于51单片机RFID射频门禁刷卡系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序 六、 文章目录 一 概要 基于51单片机RFID射频门禁刷卡系统&#xff0c;是一种将单片机技术和射频标识技术应用于门禁控制系统的…

Python与ArcGIS系列(二)获取地图文档

目录 0 简述1 获取当前地图文档2 获取磁盘中的地图文档3 获取地图文档的图层0 简述 本篇开始介绍实际代码操作,即利用arcpy(python 包)执行地理数据分析、数据转换、数据管理和地图自动化。通过arcpy调用ArcGIS中任意工具,将其与其他python工具结合使用,形成自己的工作流…

python设计模式12:状态模式

什么是状态机&#xff1f; 关键属性&#xff1a; 状态和转换 状态&#xff1a; 系统当前状态 转换&#xff1a;一种状态到另外一种状态的变化。 转换由触发事件或是条件启动。 状态机-状态图 状态机使用场景&#xff1a; 自动售货机 电梯 交通灯 组合锁 停车计时…